我有一个简单的 SPARQL 查询:
SELECT DISTINCT ?class1 ?class2
WHERE {
?class1 :child ?attribute1 .
?class2 :child ?attribute2 .
?attribute1 :objectName ?name1 .
?attribute2 :objectName ?name2 .
FILTER (?name1 = ?name2)
}
在 RDF 图中,其中一个“类”可以有多个子类。我想要做的是,找到重复的类,其中重复意味着一个类中的所有子级(由 objectName 标识)也都在另一个类中。
它的作用是,返回每个类,其中至少一个子类也存在于另一个类中。
所以我正在寻找某种方式对每个类(class)的所有 child 进行迭代,但我还找不到方法。如果有人能提供帮助,那就太好了。
谢谢
最佳答案
请注意,SPARQL 是一种声明式语言,而不是命令式语言,因此不存在迭代的概念。您可以在 RDF 存储中的 API 中执行此操作,但至少在理论上,用 SPARQL 表达它会更有效。
我认为你需要做的是找到类的所有组合,并减去某些 objectName 不同的组合。
以下内容完全未经测试!
SELECT DISTINCT ?class1 ?class2
WHERE {
?class1 :child ?attribute1 .
?class2 :child ?attribute2 .
MINUS {
?attribute1 :objectName ?name1 .
?attribute2 :objectName ?name2 .
FILTER (?name1 != ?name2 && ?attribute1 = ?attribute2 )
}
}
正确的可能性很小:),但它应该会给您一些启发。
关于loops - 查询中的 SPARQL 'for-loop',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17443848/