我现在正在通过sparql从freebase检索多跳三元组,我想从一个中间开始,从中间检索2个跃点。所以通常我会做
PREFIX ns:<http://rdf.freebase.com/ns/>
SELECT DISTINCT ?out WHERE {
?x0 ?y1 ?x1.
?x1 ?y2 ?x2.
?x2 ns:type.object.name ?name2.
FILTER(?x0 != ?x2).
FILTER(regex(str(?x2), "ns/m\\.|ns/g\\.") && regex(str(?x1), "ns/m\\.|ns/g\\.")).
VALUES ?x0 {ns:m.02qmnw}.
BIND(
CONCAT(str(?x0),'\t',str(?y1),'\t',str(?y2),'\t',str(?x2))) AS ?out)
}
这将使我在freebase中返回两跳关系链,并声明为m.02qmnw。而且对象(?x2)不是CVT(CVT只是连接n元关系的虚拟对象),因为Freebase中的CVT通常不具有“ type.object.name”属性。
但是,当我想从freebase检索四个跃点三元组时,我给出了以下约束:1.第一个(?x1)和第三个三元组(?x4)的对象应该是CVT。 2.最后的三元组(x2)的对象不应为CVT。因此,我的sparql如下
PREFIX ns:<http://rdf.freebase.com/ns/>
SELECT DISTINCT ?out WHERE {
{
?x0 ?y1 ?x1.
?x1 ?y3 ?x3.
?x3 ?y4 ?x4.
?x4 ?y2 ?x2.
?x2 ns:type.object.name ?name2.
?x3 ns:type.object.name ?name3
OPTIONAL{?x1 ns:type.object.name ?name1}
OPTIONAL{?x4 ns:type.object.name ?name4}
FILTER(?x0 != ?x2).
FILTER(?y1 != ?y3).
FILTER(?y4 != ?y2)
FILTER(!BOUND(?name1) && !BOUND(?name4) && regex(str(?x2), "ns/m\\.|ns/g\\.") && regex(str(?x1), "ns/m\\.|ns/g\\.") && regex(str(?x3), "ns/m\\.|ns/g\\.") && regex(str(?x4), "ns/m\\.|ns/g\\.")).
}
VALUES ?x0 {ns:m.02qmnw}.
BIND(
CONCAT(str(?x0),'\t',str(?y1),'\t',str(?y3),'\t',str(?y4),'\t',str(?y2),'\t',str(?x2)) AS ?out)
}
但是,这效率低下并且总是返回“超时”。那么有人对有效实施它有建议吗?我是sparql的新手,已经为这个问题感到困惑了几天?而且我还认为我的sparql命令非常繁琐。
有人可以帮助我吗?任何建议将不胜感激,非常感谢!