gpt4 book ai didi

python - 三元组组合的递归 SPARQL 查询

转载 作者:太空宇宙 更新时间:2023-11-03 10:51:40 25 4
gpt4 key购买 nike

我有以下查询,我使用 ontospy 在 Python 中递归运行:

SELECT ?c WHERE {
?c rdfs:subClassOf ?restriction .
?restriction owl:onProperty :has_part ; owl:someValuesFrom ?p .
VALUES ?p { <some_uri> }
}

基本上,我获取从中返回的值并重新运行查询以遵循本体中“部分部分”关系的层次结构。我希望通过将递归添加到查询本身来避免进行多个 SPARQL 查询。我知道如何使用 rdfs:subClassOf* 对单个三元组执行此操作,但无法弄清楚组合两个三元组的语法:

?c rdfs:subClassOf ?restriction .
?restriction owl:onProperty :has_part ; owl:someValuesFrom ?p .

这可能吗?

最佳答案

我不能给出正式的证明,但这看起来是不可能的。这不是设计属性路径的目的,也不是为什么存在一些扩展(12)。

在某些 promise 下(例如树状结构),它是 possible使用 FILTER NOT EXISTS 找出一些东西,但是,这不是一个通用的解决方案。

想法是在两个查询中执行此操作。本质上,这是 SELECT 而不是 CONSTRUCT。顺便说一句,这样的SPARQL扩展已经是proposed了.


让我们使用 Ontospy 基于哪个,因为

Ontospy does not offer any ontology-editing features, nor it can be used to interrogate a triplestore.

输入(ontology.ttl)

@prefix : <http://www.example.org/ontology#> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@base <http://www.example.org/ontology> .

<http://www.example.org/ontology> rdf:type owl:Ontology .

:hasPart rdf:type owl:ObjectProperty .

:Country rdf:type owl:Class ;
rdfs:subClassOf [ rdf:type owl:Restriction ;
owl:onProperty :hasPart ;
owl:someValuesFrom :State
] .

:State rdf:type owl:Class ;
rdfs:subClassOf [ rdf:type owl:Restriction ;
owl:onProperty :hasPart ;
owl:someValuesFrom :City
] .

:City rdf:type owl:Class .

Python代码

import rdflib

g = rdflib.Graph()
g.parse("ontology.ttl", format="n3")

qres = g.update(
"""PREFIX : <http://www.example.org/ontology#>
INSERT { ?c :hasSome ?p }
WHERE { ?c rdfs:subClassOf [ owl:onProperty :hasPart ;
owl:someValuesFrom ?p ] }""")

qres = g.query(
"""PREFIX : <http://www.example.org/ontology#>
SELECT ?a ?b WHERE {?a :hasSome+ ?b }""")

for row in qres:
print("%s :hasSome+ %s" % row)

qres = g.update(
"""PREFIX : <http://www.example.org/ontology#>
DELETE { ?s :hasSome ?o } WHERE { ?s :hasSome ?o }""")

输出

:Country :hasSome+ :State
:State :hasSome+ :City
:Country :hasSome+ :City

如果您不想修改初始 RDFLib 图,只需创建另一个:

import rdflib

g1 = rdflib.Graph()
g1.parse("ontology.ttl", format="n3")

qres = g1.query(
"""PREFIX : <http://www.example.org/ontology#>
CONSTRUCT {?c :hasSome ?p } WHERE {
?c rdfs:subClassOf [ owl:onProperty :hasPart ;
owl:someValuesFrom ?p ] }""")

g2 = rdflib.Graph();
for triple in qres: # quite a few triples
g2.add(triple)

qres = g2.query(
"""PREFIX : <http://www.example.org/ontology#>
SELECT ?a ?b WHERE { ?a :hasSome+ ?b }""")

for row in qres:
print("%s :hasSome+ %s" % row)

也许你可以使用transitiveClosure()transitive_objects()而不是在这两种情况下的第二个查询。

关于python - 三元组组合的递归 SPARQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49307502/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com