コード例 #1
0
ファイル: FindProvider.cs プロジェクト: m9ra/KnowledgeDialog
        protected override void onInstanceActivated(ConceptInstance instance, BeamGenerator generator)
        {
            var criterion       = generator.GetValue(instance, _parameter);
            var criterionValues = generator.GetPropertyValues(criterion);

            criterionValues.Remove(Concept2.OnSetListener); // TODO internal property removal should be done in more systematic way
            criterionValues.Remove(Concept2.HasProperty);
            criterionValues.Remove(Concept2.HasPropertyValue);

            var requiredProperties = new HashSet <Concept2>(criterionValues.Values.Select(i => i.Concept));

            requiredProperties.Add(criterion.Concept);

            var result         = FindRelevantConcepts(generator, requiredProperties);
            var isSubjectClass = generator.GetInverseConceptValues(Concept2.InstanceOf, criterion).Any();


            if (result.Count == 0)
            {
                if (isSubjectClass)
                {
                    generator.Push(new StaticScoreEvent(0.1));
                }
                else
                {
                    generator.Push(new StaticScoreEvent(-0.1));
                }

                generator.Push(new InstanceOutputEvent(new ConceptInstance(Concept2.NotFound)));
            }
            else if (result.Count == 1)
            {
                generator.Push(new StaticScoreEvent(0.5));
                generator.Push(new InstanceOutputEvent(result.First()));
            }
            else
            {
                if (generator.IsProperty(criterion.Concept))
                {
                    generator.Push(new StaticScoreEvent(-0.15));
                }

                var needRefinementInstance = new ConceptInstance(Concept2.NeedsRefinement);
                generator.SetValue(needRefinementInstance, Concept2.Subject, criterion);
                generator.SetValue(criterion, Concept2.OnSetListener, instance);
                generator.Push(new InstanceOutputEvent(needRefinementInstance));
            }
        }
コード例 #2
0
        protected override IEnumerable <string> execute(BeamGenerator generator)
        {
            var fullRelation = Get <PropertySetEvent>(p => IsDefined(p.SubstitutedValue.Concept) && IsDefined(p.Target.Instance?.Concept));

            if (fullRelation == null)
            {
                yield break;
            }

            var targetInstance = fullRelation.Target.Instance;

            if (targetInstance == null)
            {
                yield break;
            }

            var children = generator.GetInverseConceptValues(Concept2.InstanceOf, targetInstance);

            if (children.Any())
            {
                //TODO add learning for classes
                yield break;
            }

            var parameters = generator.GetParameterDefinitions(targetInstance);

            if (parameters.Any(p => p.Property == fullRelation.Target.Property))
            {
                //don't learn argument values
                yield break;
            }

            generator.Push(new StaticScoreEvent(0.1));
            var remember = RememberPropertyValue.Create(generator, fullRelation.Target, fullRelation.SubstitutedValue);

            YesNoPrompt.Generate(generator, remember, new ConceptInstance(Concept2.Nothing));
            yield return($"So you think, {singularWithProperty(fullRelation.Target.Instance)} ?");
        }