我的目标是以图形方式表示指定资源的深度两条边内的 S->P->O 关系,p:Person_1
。我希望从查询中返回该路径长度内的所有关系?s, ?p, ?o
在我的图形应用程序中进行进一步处理。
我尝试了下面的第一个查询,它给了我第一组?s ?p ?o
重复,然后?p2, ?o2, ?p3, ?o3
作为结果中的附加列。我要绑定?p2
and ?p3
to ?p
, ?o2
and ?o3
to ?o
.
SELECT *
WHERE {
p:Person_1 ?p ?o .
BIND("p:Person_1" as ?s)
OPTIONAL{
?o ?p2 ?o2 .
}
OPTIONAL{
?o2 ?p3 ?o3 .
}
}
然后,基于如何从 RDF 图中的给定资源构造获取整个子图? https://stackoverflow.com/questions/37186530/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
and SELECT
语句按照建议的模式工作。
CONSTRUCT { ?s ?p ?o }
FROM <http://localhost:8890/MYGRAPH>
where { p:Person_1 (x:foo|!x:bar)* ?s .
?s ?p ?o .
} LIMIT 100
and:
SELECT s ?p ?o
FROM <http://localhost:8890/MYGRAPH>
where { p:Person_1 (x:foo|!x:bar)* ?s .
?s ?p ?o .
} LIMIT 100
The SELECT
导致无法使用以下方法删除多个重复项DISTINCT
,这会导致一个错误,我认为这是由于某些返回值的“数据类型”造成的。
Virtuoso 22023 Error SR066: Unsupported case in CONVERT (DATETIME -> IRI_ID)
看起来一些 SPARQL 后处理是有序的。
这让我大部分时间都到了那里。仍然希望我能为 SPARQL 找到一个解决方案,就像 Cypher 的“跳数”一样:
OPTIONAL MATCH path=s-[*1..3]-(o)