如何在SPARQL中遍历RDF树并找到树外的连接?
考虑具有根节点“a”和“hasChild”关系(例如产品结构)的树,如下所示: 目标是找出: 哪些节点在树外有父节点? 在这种情况下,答案应该是‘B’和‘Q’,因为它们的父母在树外 查询应该转到每个节点并检查其父节点,而不是创建子节点列表并检查每个子节点 我如何高效地(应该适用于数百万个节点)通过SPARQL遍历此树并回答此问题? 这是我尝试过的,但结果为0:如何在SPARQL中遍历RDF树并找到树外的连接?,sparql,rdf,semantic-web,triplestore,allegrograph,Sparql,Rdf,Semantic Web,Triplestore,Allegrograph,考虑具有根节点“a”和“hasChild”关系(例如产品结构)的树,如下所示: 目标是找出: 哪些节点在树外有父节点? 在这种情况下,答案应该是‘B’和‘Q’,因为它们的父母在树外 查询应该转到每个节点并检查其父节点,而不是创建子节点列表并检查每个子节点 我如何高效地(应该适用于数百万个节点)通过SPARQL遍历此树并回答此问题? 这是我尝试过的,但结果为0: PREFIX xxx: <http://example.org/xxx#> select * where
PREFIX xxx: <http://example.org/xxx#>
select * where {
xxx:A xxx:hasChild* ?child .
?child ^xxx:hasChild ?foreignParent .
?child ^xxx:hasChild ?parent .
FILTER (?parent =! ?foreignParent) .
}
前缀xxx:
选择*where{
xxx:A xxx:hasChild*?孩子。
?子女^xxx:hasChild?外籍父母。
?子^xxx:hasChild?父级。
过滤器(?父项=!?外来父项)。
}
附上相应的样本数据:
<?xml version="1.0"?>
<rdf:RDF
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:owl="http://www.w3.org/2002/07/owl#"
xmlns:xxx="http://example.org/xxx#"
xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
xml:base="http://example.org/xxx">
<owl:Ontology rdf:about="">
<owl:versionInfo>Created with TopBraid Composer</owl:versionInfo>
</owl:Ontology>
<owl:Class rdf:ID="Other">
<rdfs:label>Other</rdfs:label>
<rdfs:subClassOf rdf:resource="http://www.w3.org/2002/07/owl#Thing"/>
</owl:Class>
<owl:Class rdf:ID="Item">
<rdfs:label>Item</rdfs:label>
<rdfs:subClassOf rdf:resource="http://www.w3.org/2002/07/owl#Thing"/>
</owl:Class>
<rdf:Property rdf:ID="hasChild">
<rdfs:range rdf:resource="#Item"/>
<rdfs:range rdf:resource="#Other"/>
<rdfs:domain rdf:resource="#Item"/>
<rdfs:label>has child</rdfs:label>
</rdf:Property>
<xxx:Other rdf:ID="Fake_1">
<xxx:hasChild>
<xxx:Item rdf:ID="B">
<xxx:hasChild>
<xxx:Item rdf:ID="D">
<xxx:hasChild>
<xxx:Item rdf:ID="F"/>
</xxx:hasChild>
<xxx:hasChild>
<xxx:Item rdf:ID="E"/>
</xxx:hasChild>
</xxx:Item>
</xxx:hasChild>
<xxx:hasChild>
<xxx:Item rdf:ID="C"/>
</xxx:hasChild>
</xxx:Item>
</xxx:hasChild>
<rdfs:label>Fake 1</rdfs:label>
</xxx:Other>
<xxx:Other rdf:ID="Fake_2">
<xxx:hasChild>
<xxx:Item rdf:ID="Q"/>
</xxx:hasChild>
<rdfs:label>Fake 2</rdfs:label>
</xxx:Other>
<xxx:Item rdf:ID="A">
<xxx:hasChild>
<xxx:Item rdf:ID="G">
<xxx:hasChild>
<xxx:Item rdf:ID="X">
<xxx:hasChild>
<xxx:Item rdf:ID="Z"/>
</xxx:hasChild>
<xxx:hasChild>
<xxx:Item rdf:ID="Y"/>
</xxx:hasChild>
</xxx:Item>
</xxx:hasChild>
<xxx:hasChild>
<xxx:Item rdf:ID="R">
<xxx:hasChild>
<xxx:Item rdf:ID="W"/>
</xxx:hasChild>
<xxx:hasChild>
<xxx:Item rdf:ID="S">
<xxx:hasChild>
<xxx:Item rdf:ID="V"/>
</xxx:hasChild>
<xxx:hasChild>
<xxx:Item rdf:ID="U"/>
</xxx:hasChild>
<xxx:hasChild>
<xxx:Item rdf:ID="T"/>
</xxx:hasChild>
</xxx:Item>
</xxx:hasChild>
</xxx:Item>
</xxx:hasChild>
<xxx:hasChild>
<xxx:Item rdf:ID="M">
<xxx:hasChild rdf:resource="#Q"/>
<xxx:hasChild>
<xxx:Item rdf:ID="P"/>
</xxx:hasChild>
<xxx:hasChild>
<xxx:Item rdf:ID="O"/>
</xxx:hasChild>
<xxx:hasChild>
<xxx:Item rdf:ID="N"/>
</xxx:hasChild>
</xxx:Item>
</xxx:hasChild>
<xxx:hasChild>
<xxx:Item rdf:ID="H">
<xxx:hasChild>
<xxx:Item rdf:ID="L"/>
</xxx:hasChild>
<xxx:hasChild>
<xxx:Item rdf:ID="K"/>
</xxx:hasChild>
<xxx:hasChild>
<xxx:Item rdf:ID="J"/>
</xxx:hasChild>
<xxx:hasChild>
<xxx:Item rdf:ID="I"/>
</xxx:hasChild>
</xxx:Item>
</xxx:hasChild>
</xxx:Item>
</xxx:hasChild>
<xxx:hasChild rdf:resource="#B"/>
</xxx:Item>
</rdf:RDF>
使用TopBraid Composer创建
其他
项目
有孩子
假1
假2
诀窍是确保没有从树根到外部父节点的路径。您可以通过筛选器NOT EXISTS
构造来实现这一点,如下所示:
PREFIX xxx: <http://example.org/xxx#>
SELECT ?child ?foreignParent
WHERE {
xxx:A xxx:hasChild+ ?child.
?child ^xxx:hasChild ?foreignParent.
FILTER NOT EXISTS { xxx:A xxx:hasChild* ?foreignParent }
}
前缀xxx:
选择?子项?外来父项
在哪里{
xxx:A xxx:hasChild+?孩子。
?子女^xxx:hasChild?外籍父母。
筛选器不存在{xxx:A xxx:hasChild*?foreignParent}
}
这是否会扩展到“数百万个节点”将取决于a)树的深度和b)您使用的三重存储。我使用您提供的测试数据在我的笔记本电脑上使用RDF4J运行查询,结果如下:
Evaluating SPARQL query...
+-------------------------------------+-------------------------------------+
| child | foreignParent |
+-------------------------------------+-------------------------------------+
| <http://example.org/xxx#B> | <http://example.org/xxx#Fake_1> |
| <http://example.org/xxx#Q> | <http://example.org/xxx#Fake_2> |
+-------------------------------------+-------------------------------------+
2 result(s) (19 ms)
正在评估SPARQL查询。。。
+-------------------------------------+-------------------------------------+
|子女|外籍父母|
+-------------------------------------+-------------------------------------+
| | |
| | |
+-------------------------------------+-------------------------------------+
2个结果(19毫秒)