Аллегрограф - Функторы, как свойства объектов RDF? - PullRequest
3 голосов
/ 13 июля 2011

Используя Аллегрограф , функторы Пролога довольно круты, но есть один недостаток.

Допустим, вы определили функтор, который связывает две сущности, например parentOf , что равно "! N: motherOf ИЛИ ! N: FatherOf", которые оба свойства объекта rdf определены в вашей онтологии (не функторы).

Давайте определим триплет "A ! N: FatherOf B".Поскольку " parentOf " является функтором, а не свойством объекта rdf, если вы запросите все свойства, которые связывают A et B, вы получите только триплет "A ! N: FatherOf B "(но не" родитель B ").

Единственный способ узнать, является ли A родителем B, - это задать булевский вопрос напрямую.

Поэтому мой вопрос таков: как можно легко получить результат "get RDF"триплеты, составленные из ФАКТОВ + ЗАКЛЮЧЕННЫХ ФАКТОВ, порожденных функторами? "

Ответы [ 2 ]

2 голосов
/ 14 июля 2011

Функторы Prolog являются частью программы Prolog. Когда вы пишете запрос через хранилище AllegroGraph, используя Prolog, вы действительно пишете программу Prolog, которая получает набор ответов на ограничения, выраженные в программе.

parentOf не является частью магазина, это часть программы.

То, что вы пытаетесь сделать, это материализовать знания, подразумеваемые программой Prolog, так что они доступны в той же форме, что и наземные тройки.

Для этого вам нужно написать… программу Prolog, которая выводит полученные знания и добавляет их в хранилище.

Вот код, который должен помочь. Это некоторая настройка и пример в Лиспе, но функторы Пролога должны быть очевидны.

;; 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"))
0 голосов
/ 05 июня 2012

Хотите ли вы что-то подобное?

(<-- (parentOf ?a ?b)
    (or
        (q ?a !n:fatherOf ?b)
        (q ?a !n:motherOf ?b)))

(select (?a ?b)
    (parentOf ?a ?b))

Оператор выбора вернет тройки, в которых есть n: motherOf или n: motherOf.

...