繁体   English   中英

Sparql,如何合并不同的结果

[英]Sparql, how to merge different results

我试图创建一个SPARQL查询,以查找Jim认识的所有人员,然后查找Jim的认识者认识的人员,然后找到类似链的东西。

例如,我有:

Jim knows Clare and Antoine    
Clare knows Jim and David
Antoine knows David and Clare
David knows Clare

因此结果如下:

result1: Clare, Antoine
result2: Jim, David, David, Clare
result3: Clare, David, Clare, Clare, Jim, David

我或多或少地做了类似树的东西。

我想要的是将result1result2result3合并到result4 因此, result4将是:

result4: clare, antoine, jim, david, david, clare, clare, david, clare, clare, jim, david.

然后使用DISTINCT删除重复项。 请问我该如何实现?

SELECT  ?Result1 ?Result2 ?Result3
WHERE{
    {
        base:Knows  dc:Names        _:BN1 .
        _:BN1       dc:FName        "Jim";
                dc:KnownFName           ?Result1 .  
    }
    .
    {
        base:Knows  dc:Names        _:BN2 .
        _:BN2       dc:FName        ?Result1;
                dc:KnownFName           ?Result2 .
    }
    .   
    {
        base:Knows  dc:Names        _:BN3 .
        _:BN3       dc:FName        ?Result2;
                dc:KnownFName           ?Result3 .
    }
}

假设您的示例表示如下:

<http://example.com/person/1> <http://xmlns.com/foaf/0.1/knows> <http://example.com/person/2> .
<http://example.com/person/1> <http://xmlns.com/foaf/0.1/knows> <http://example.com/person/3> .
<http://example.com/person/2> <http://xmlns.com/foaf/0.1/knows> <http://example.com/person/1> .
<http://example.com/person/2> <http://xmlns.com/foaf/0.1/knows> <http://example.com/person/4> .
<http://example.com/person/3> <http://xmlns.com/foaf/0.1/knows> <http://example.com/person/4> .
<http://example.com/person/3> <http://xmlns.com/foaf/0.1/knows> <http://example.com/person/2> .
<http://example.com/person/4> <http://xmlns.com/foaf/0.1/knows> <http://example.com/person/2> .

<http://example.com/person/1> <http://www.w3.org/2000/01/rdf-schema#label> "Jim" .
<http://example.com/person/2> <http://www.w3.org/2000/01/rdf-schema#label> "Clare" .
<http://example.com/person/3> <http://www.w3.org/2000/01/rdf-schema#label> "Antoine" .
<http://example.com/person/4> <http://www.w3.org/2000/01/rdf-schema#label> "David" .

然后,您可以使用SPARQL的UNION功能,通过合并三个独立查询的结果来实现所需的功能。 可以使用SPARQL属性路径更简洁地表示它:

PREFIX foaf: <http://xmlns.com/foaf/0.1/>

SELECT DISTINCT * WHERE {
{ SELECT * WHERE {
<http://example.com/person/1> foaf:knows/rdfs:label ?knowsName .
} }
UNION
{ SELECT * WHERE {
<http://example.com/person/1> foaf:knows/foaf:knows/rdfs:label ?knowsName .
} }
UNION
{ SELECT * WHERE {
<http://example.com/person/1> foaf:knows/foaf:knows/foaf:knows/rdfs:label ?knowsName .
} }
}

您还可以通过单个属性路径表达式来获得knows谓词的完全可传递闭包:

PREFIX foaf: <http://xmlns.com/foaf/0.1/>

SELECT * WHERE {
<http://example.com/person/1> foaf:knows+/rdfs:label ?knowsName .
} 

...如果您的Triplestore支持SPARQL 1.1。 否则,您将不得不使用推理或重复查询来获得完全关闭。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM