SPARQL选择无法按预期工作

时间:2015-05-08 07:13:51

标签: sparql linked-data

如果我运行此查询

SELECT ?a ?b ?c ?g ?maxtrust
WHERE
{
  {
    SELECT ?a (MAX(?t) AS ?maxtrust)
    WHERE{
    GRAPH ?g { ?a a gr:productorservicemodel } 
    GRAPH <uri:trust> { ?g exepo:trust ?t}
    }
    GROUP BY ?a
  }
GRAPH ?g {?a ?b ?c}
GRAPH <uri:trust> { ?g exepo:trust ?maxtrust}
}

我得到了这个回复:

| a         | b                | c                        | g         | maxtrust |
|-----------|------------------|--------------------------|-----------|----------|
| uri:prodA | rdf:type         | gr:ProductOrServiceModel | uri:alice | 1.0      |
| uri:prodA | exe:EarCoupling  | Intraaural               | uri:alice | 1.0      |
| uri:prodA | exe:WearingStyle | In-ear                   | uri:alice | 1.0      |
| uri:prodB | rdf:type         | gr:ProductOrServiceModel | uri:bob   | 0.5      |
| uri:prodB | exe:EarCoupling  | Extraauricolare          | uri:bob   | 0.5      |

因为我只对ag之间的关系感兴趣,所以我猜这个查询会完成这个诀窍:

SELECT ?a ?g
WHERE
{
  {
    SELECT ?a (MAX(?t) AS ?maxtrust)
    WHERE{
    GRAPH ?g { ?a a gr:productorservicemodel } 
    GRAPH <uri:trust> { ?g exepo:trust ?t}
    }
    GROUP BY ?a
  }
GRAPH ?g {?a ?b ?c}
GRAPH <uri:trust> { ?g exepo:trust ?maxtrust}
}

我希望这个结果:

| a         | g         |
|-----------|-----------|
| uri:prodA | uri:alice |
| uri:prodA | uri:alice |
| uri:prodA | uri:alice |
| uri:prodB | uri:bob   |
| uri:prodB | uri:bob   |

相反,我得到了这个:

| a         | g         |
|-----------|-----------|
| uri:prodA | uri:alice |
| uri:prodA | uri:alice |
| uri:prodA | uri:alice |

发生了什么事?我对SPARQL逻辑的理解是完全错误的吗?

修改:更多信息

数据集是:

alice(GRAPH uri:alice):

uri:prodA
    a gr:ProductOrServiceModel;
    exe:EarCoupling "Intraaural"^^xsd:string ;
    exe:WearingStyle "In-ear"^^xsd:string .

bob(GRAPH uri:bob):

uri:prodA
    a gr:ProductOrServiceModel;
    exe:EarCoupling "Intraauricolare"^^xsd:string .
uri:prodB
    exe:WearingStyle "extraauricolare"^^xsd:string .

trust(GRAPH uri:trust):

uri:alice exe:trust "1.0"^^xsd:float .
uri:bob exe:trust "0.5"^^xsd:float .

我正在使用stardog作为triplestore

1 个答案:

答案 0 :(得分:0)

如果您只对?a?g之间的关系感兴趣,那么您的查询可能会简单得多:

select distinct ?a ?g where {
  graph ?g { ?a [] [] }
}