プロローグファンクタは、プロローグプログラムの一部です。 Prologを使用してAllegroGraphストアにクエリを書くときは、実際にはプログラムで表現された制約への回答の集合を導出するPrologプログラムを作成しています。
parentOfは、ストアの一部ではなく、プログラムの一部です。
は、Prologプログラムが暗黙の知識を持っているため、グランドトリプルと同じ形式で利用できます。
これを行うには、次のように記述する必要があります。推定された知識を派生させ、それをストアに追加するPrologプログラム。
ここにいくつか役立つコードがあります。これはLispのいくつかの設定と例ですが、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"))
回答ありがとうございました。はい、私はすでに、すべてのファンクタを実行し、データベースにトリプレットとして結果を挿入するcronタスクを作成することを考えました。これは、前方連鎖推論のようなものですが、リアルタイムではありません。 :(だからベストアイデア? – Aymeric