如何将起始资源中的所有S-&>;P-&>O三元组返回到指定的路径深度? [英] How to return all S->P->O triples from a starting resource to a specified path depth?
本文介绍了如何将起始资源中的所有S-&>;P-&>O三元组返回到指定的路径深度?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我的目标是以图形方式表示距离指定资源p:Person_1
两个边的深度内的S->P->O关系。我希望将该路径长度内的所有关系作为?s, ?p, ?o
从我的查询中返回,以便在我的图形应用程序中进一步处理。
?s ?p ?o
重复,然后?p2, ?o2, ?p3, ?o3
作为结果中的附加列。我想将?p2
和?p3
绑定到?p
、?o2
和?o3
到?o
。
SELECT *
WHERE {
p:Person_1 ?p ?o .
BIND("p:Person_1" as ?s)
OPTIONAL{
?o ?p2 ?o2 .
}
OPTIONAL{
?o2 ?p3 ?o3 .
}
}
然后,基于How do I construct get the whole sub graph from a given resource in RDF Graph?,我尝试使用CONSTRUCT
返回图形。
PREFIX p: <http://www.example.org/person/>
PREFIX x: <example.org/foo/>
construct { ?s ?p ?o }
FROM <http://localhost:8890/MYGRAPH>
where { p:Person_1 (x:|!x:)* ?s .
?s ?p ?o .
}
我正在使用Virtuoso,收到错误:
Virtuoso 37000 Error SP031: SPARQL compiler: Variable ?_::trans_subj_9_3 in T_IN list is not a value from some triple
我可以对第一个查询的结果进行后处理,但我希望了解如何使用SPARQL正确执行此操作,最好是在Virtuoso上。
测试@AKSW的建议后更新:CONSTRUCT
和SELECT
语句都使用建议的模式。
CONSTRUCT { ?s ?p ?o }
FROM <http://localhost:8890/MYGRAPH>
where { p:Person_1 (x:foo|!x:bar)* ?s .
?s ?p ?o .
} LIMIT 100
和:
SELECT s ?p ?o
FROM <http://localhost:8890/MYGRAPH>
where { p:Person_1 (x:foo|!x:bar)* ?s .
?s ?p ?o .
} LIMIT 100
SELECT
会产生几个无法使用DISTINCT
删除的重复项,这会导致错误,我认为这是由于某些返回值的"数据类型"造成的。
Virtuoso 22023 Error SR066: Unsupported case in CONVERT (DATETIME -> IRI_ID)
似乎有一些SPARQL后期处理是按顺序进行的。
这就把我带到了大部分地方。仍然希望我能找到一个类似Cypher的"跳数"的SPARQL解决方案:
OPTIONAL MATCH path=s-[*1..3]-(o)
Virtuoso
这里有一个在推荐答案中工作的SPARQL查询。注意SPARQL W3C标准不支持此语法,它将在其他三元组存储中失败。
PREFIX p: <http://www.example.org/person/>
PREFIX x: <example.org/foo/>
# CONSTRUCT {?s ?p ?o} # If you wish to return the graph
SELECT ?s ?p ?o # To return the triples
FROM <http://localhost:8890/MYGRAPH>
where { p:Person_1 (x:foo|!x:bar){1,3} ?s .
?s ?p ?o .
}LIMIT 100
另请参阅K.Idehen的维基条目:http://linkedwiki.com/exampleView.php?ex_id=141
感谢@Joshua Taylor在同一领域的建议。
这篇关于如何将起始资源中的所有S-&>;P-&>O三元组返回到指定的路径深度?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文