Allegrograph - функторы как свойства РДФ объекты?
ИспользуяAllegrograph , функторы пролога довольно удивительны, но есть один недостаток.
Предположим, вы определяете функтор, который связывает две сущности, например parentOf , который равен "!Н: мать или !Н: ... папа", которые являются как свойства объекта РДФ, определенных в онтологии (не функторов).Давайте определим триплет " A !n: отец B". Поскольку "parentOf " является функтором, а не свойством объекта rdf, если вы запросите для всех свойств, которые связывают A и B, вы получите только триплет " A !n: отец B" (но не "родитель B").
Единственный способ узнать, является ли A родителем B, - это задать Булев вопрос напрямую.Итак, мой вопрос: Как легко получить результат "получить триплеты RDF, состоящие из фактов + выводимых фактов, порожденных функторами ?"
2 ответа:
Пролог-функторы являются частью Пролог-программы. Когда вы пишете запрос через allegrograph store с помощью Prolog, вы на самом деле пишете программу Prolog, которая получает набор ответов на ограничения, выраженные в программе.
parentOf не является частью магазина, это часть программы.
То, что вы пытаетесь сделать, - это материализовать знания, подразумеваемые программой пролога, таким образом, чтобы они были доступны в той же форме, что и основные тройки.
Делать что вам нужно написать ... Пролог-программу, которая извлекает полученные знания и добавляет их в хранилище.
Вот код, который должен помочь. Это некоторая настройка и пример в Lisp, но функторы пролога должны быть очевидны.
;; Assume the prefix is set up. These are for the Lisp environment. (register-namespace "ex" "http://example.com/") (enable-!-reader) ;; Define functors for basic relationships. (<-- (parent ?x ?y) (father ?x ?y)) (<- (parent ?x ?y) (mother ?x ?y)) (<-- (male ?x) (q- ?x !ex:sex !ex:male)) (<-- (female ?x) (q- ?x !ex:sex !ex:female)) (<-- (father ?x ?y) (male ?x) (q- ?x !ex:has-child ?y)) (<-- (mother ?x ?y) (female ?x) (q- ?x !ex:has-child ?y)) ;; Functors for adding triples. (<-- (a- ?s ?p ?o) ;; Fails unless all parts ground. (lisp (add-triple ?s ?p ?o))) (<-- (a- ?s ?p ?o ?g) ;; Fails unless all parts ground. (lisp (add-triple ?s ?p ?o ?g))) (<-- (a-- ?s ?p ?o) ;; Fails unless all parts ground. (lispp (not (get-triple :s ?s :p ?p :o ?o))) (lisp (add-triple ?s ?p ?o))) (<-- (a-- ?s ?p ?o ?g) ;; Fails unless all parts ground. (lispp (not (get-triple :s ?s :p ?p :o ?o :g ?g))) (lisp (add-triple ?s ?p ?o ?g))) ;; Add some sample data. (create-triple-store "/tmp/foo") (add-triple !ex:john !ex:sex !ex:male) (add-triple !ex:dave !ex:sex !ex:male) (add-triple !ex:alice !ex:sex !ex:female) (add-triple !ex:alice !ex:has-child !ex:dave) (add-triple !ex:john !ex:has-child !ex:dave) ;; Now who is a parent of whom? (select (?parent ?child) (parent ?parent ?child)) ;; Returns: ;; (("http://example.com/john" "http://example.com/dave") ;; ("http://example.com/alice" "http://example.com/dave")) ;; Add the triples. (select (?parent ?child) ; never succeeds (parent ?parent ?child) (a-- ?parent !ex:parentOf ?child) (fail)) ;; Now see what's in the store using the materialized triples. (select (?parent ?child) (q- ?parent !ex:parentOf ?child)) ;; Returns: ;; (("http://example.com/john" "http://example.com/dave") ;; ("http://example.com/alice" "http://example.com/dave"))