SPARQL 获取相交集

SPARQL getting an intersecting set

我关注数据:

:A :hasCity City1
:A :hasCity City2
:A :hasCity City3
:A :hasCity City4

:K :hasCity City1
:K :hasCity City2

......

我试图找到所有包含城市 1 和 2 的主题,所以我编写了查询:

select ?s 
{
   ?s :hasCity ?city.
   FILTER (?city =:City1 && ?city=:City2)
}

但是,我没有得到任何结果。

如果我这样做:

select ?s 
{
   ?s :hasCity ?city.
   FILTER (?city =:City1)
}

我得到 A、K、Q、M,如果我这样做:

select ?s 
{
   ?s :hasCity ?city.
   FILTER (?city =:City2)
}

我回来了A,K,L

所以当我使用 && 运算符时,我应该取回 A&K,对吗?我错过了什么吗?

你需要做的是询问共享同一组对象的所有主题,在相同的 属性 上使用三重模式。您最终会得到一个非常简单的查询:

SELECT ?s {?s :hasCity :City1, :City2}

使用:hasSubject,如果你想保留单行查询,你只需要属性的倒数:

SELECT ?s { ?s ^:hasSubject :City1, :City2}

使用 = 时,您需要确保将苹果与苹果进行比较。例如 ?a = ?bstr(?a) = str(<b>).