【问题标题】:Sparql, how to merge different resultsSparql,如何合并不同的结果
【发布时间】:2014-03-28 22:53:18
【问题描述】:

我正在尝试创建一个 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 .
    }
}

【问题讨论】:

    标签: xml rdf sparql


    【解决方案1】:

    假设您的示例如下所示:

    <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。否则,您将不得不使用推理或重复查询来获得完全关闭。

    【讨论】:

    • 一千个赞.... TYVM!!!
    猜你喜欢
    • 1970-01-01
    • 2020-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-06
    • 2019-07-09
    相关资源
    最近更新 更多