我的目标是以图形方式表示来自指定资源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后处理正在进行中。
这让我大部分都在那里。仍然希望我能找到SPARQL的解决方案,就像Cypher的“跳数”:
OPTIONAL MATCH path=s-[*1..3]-(o)
答案 0 :(得分:1)
这是一个适用于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的wiki条目:http://linkedwiki.com/exampleView.php?ex_id=141
感谢@Joshua Taylor在同一领域的建议。
答案 1 :(得分:0)
on godbolt包含{n,m}
运算符,用于处理此问题,该问题已在Virtuoso中实施(并将继续受支持)。这是对@ tim的回复的调整。
实时SPARQL Query Results Page,可在默认的DBpedia查询编辑器中打开查询源代码。
实际查询示例:
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
SELECT DISTINCT ?s AS ?Entity
?o AS ?Category
WHERE {
?s rdf:type <http://dbpedia.org/ontology/AcademicJournal> ;
rdf:type{1,3} ?o
}
LIMIT 100
答案 2 :(得分:0)
请注意final SPARQL 1.1已弃用r{n,m}
运算符(但在Virtuoso中仍会受支持),如果您使用r/r?/r?
代替r{1,3}
,则可以想严格按照当前的规范工作:
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
SELECT DISTINCT ?s AS ?Entity
?o AS ?Category
WHERE {
?s rdf:type <http://dbpedia.org/ontology/AcademicJournal> ;
rdf:type / rdf:type? / rdf:type? ?o
}
LIMIT 100
这里是live example,针对在Virtuoso中托管的DBpedia实例。
答案 3 :(得分:0)
如果您正在寻找类似LinkedIn的联系人网络和个人之间的分离度表示,以下是使用特定于Virtuoso的SPARQL Extensions解决此特定问题的示例:
SELECT ?o AS ?WebID
((SELECT COUNT (*) WHERE {?o foaf:knows ?xx})) AS ?contact_network_size
?dist AS ?DegreeOfSeparation
<http://www.w3.org/People/Berners-Lee/card#i> AS ?knowee
WHERE
{
{
SELECT ?s ?o
WHERE
{
?s foaf:knows ?o
}
} OPTION (TRANSITIVE, t_distinct, t_in(?s), t_out(?o), t_min (1), t_max (4), t_step ('step_no') AS ?dist) .
FILTER (?s= <http://www.w3.org/People/Berners-Lee/card#i>)
FILTER (isIRI(?s) and isIRI(?o))
}
ORDER BY ?dist DESC (?contact_network_size)
LIMIT 500
注意:此方法是(在当前时间)公开实体关系图中包含传递关系的实体之间的实际关系跳跃的唯一方法。