想象一下,你有一个简单的社交网络,人们必须只有一个rdfs:label
有价值的财产,"Person"
并且任何数量的foaf:knows
人也必须是具有相同结构的人.一些示例数据可能是:
:peter foaf:knows :john;
foaf:knows :anna;
rdfs:label "Person" .
:john foaf:knows :anna;
rdfs:label "Person" .
:anna rdfs:label "Person" .
Run Code Online (Sandbox Code Playgroud)
在逻辑术语中,定义可能类似于:
∀x(Person(x)≡rdfs:label(x,"Person")∧∀y(rdfs:label(x,y)→y ="Person")∧∀y(foaf:knows(x,y)→人(Y)))
是否可以在SPARQL中表达这些递归定义?
我能够表达部分查询而没有递归引用foaf:knows
as:
PREFIX ex: <http://xmlns.com/foaf/0.1/>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX rdfs:<http://www.w3.org/2000/01/rdf-schema#>
select ?person {
# Ensure there is only one rdfs:label
{ SELECT ?person {
?person rdfs:label ?o .
} GROUP BY ?person HAVING (COUNT(*)=1)}
# Ensure the rdfs:label value is "Person"
{ SELECT ?person {
?person rdfs:label ?o .
FILTER …
Run Code Online (Sandbox Code Playgroud)