为什么下面的sparql查询不返回笛卡尔乘积

为什么下面的sparql查询不返回笛卡尔乘积,sparql,virtuoso,Sparql,Virtuoso,我是sparql领域的初学者。我写了这个查询: prefix pp: <http://purl.org/dc/elements/1.1/> select ?title,?autor1, ?autor2 from <http://gutenberg.lib> where { ?s pp:title ?title. ?s pp:creator ?ID1. ?ID1 ?p ?autor1. optional{ ?s pp:crea

我是sparql领域的初学者。我写了这个查询:

prefix pp: <http://purl.org/dc/elements/1.1/>
select ?title,?autor1, ?autor2
from <http://gutenberg.lib>
where {
      ?s pp:title ?title.
      ?s pp:creator ?ID1.
      ?ID1 ?p ?autor1.
      optional{ ?s pp:creator ?ID2.
                ?ID2 ?p ?autor2.
              }
} order by ?s

我希望我能得到这样的东西:

 TITLE11, CREATOR11, CREATOR11
 TITLE11, CREATOR11, CREATOR12
 TITLE11, CREATOR12, CREATOR11
 TITLE11, CREATOR12, CREATOR12
 TITLE11, CREATOR11, CREATOR11
 TITLE11, CREATOR12, CREATOR12
The Mystery     http://www.w3.org/1999/02/22-rdf-syntax-ns#Bag  http://www.w3.org/1999/02/22-rdf-syntax-ns#Bag

The Mystery     White, Stewart Edward, 1873-1946    White, Stewart Edward, 1873-1946

The Mystery     Adams, Samuel Hopkins, 1871-1958    Adams, Samuel Hopkins, 1871-1958
但我得到了这样的东西:

 TITLE11, CREATOR11, CREATOR11
 TITLE11, CREATOR11, CREATOR12
 TITLE11, CREATOR12, CREATOR11
 TITLE11, CREATOR12, CREATOR12
 TITLE11, CREATOR11, CREATOR11
 TITLE11, CREATOR12, CREATOR12
The Mystery     http://www.w3.org/1999/02/22-rdf-syntax-ns#Bag  http://www.w3.org/1999/02/22-rdf-syntax-ns#Bag

The Mystery     White, Stewart Edward, 1873-1946    White, Stewart Edward, 1873-1946

The Mystery     Adams, Samuel Hopkins, 1871-1958    Adams, Samuel Hopkins, 1871-1958
因此,没有像SQL那样的笛卡尔乘积

这是一个缺陷还是一个功能

请注意,片段?ID1?p?autor1中的?p。是因为数据中没有作者实名属性。Guttenberg只给出了这样的字符串:http://www.w3.org/1999/02/22-rdf-syntax-ns_1 对于第一作者,http://www.w3.org/1999/02/22-rdf-syntax-ns_2 第二等

例如,对于真实数据,它看起来是这样的:

 TITLE11, CREATOR11, CREATOR11
 TITLE11, CREATOR11, CREATOR12
 TITLE11, CREATOR12, CREATOR11
 TITLE11, CREATOR12, CREATOR12
 TITLE11, CREATOR11, CREATOR11
 TITLE11, CREATOR12, CREATOR12
The Mystery     http://www.w3.org/1999/02/22-rdf-syntax-ns#Bag  http://www.w3.org/1999/02/22-rdf-syntax-ns#Bag

The Mystery     White, Stewart Edward, 1873-1946    White, Stewart Edward, 1873-1946

The Mystery     Adams, Samuel Hopkins, 1871-1958    Adams, Samuel Hopkins, 1871-1958
这本神秘的书没有其他三连环标题,author1 author2

文字不能是主题: 你没有准确地向我们展示数据或结果。如果数据的格式为:

 S1 pp:title "TITLE11"
 S1 pp:creator "CREATOR11"
 S1 pp:creator "CREATOR12"
 S2 pp:title "TITLE21"
 S2 pp:creator "CREATOR21"
 S2 pp:creator "CREATOR22"
 S2 pp:creator "CREATOR23"
S1 pp:title "TITLE11"
S1 pp:creator "CREATOR11"
S1 pp:creator "CREATOR12"
如果creator属性的值是字符串,那么您不应该为其获取任何匹配项

?s pp:creator ?ID1.
?ID1 ?p ?autor1.
因为?ID1将绑定到一个字符串,然后第二行不能有任何匹配项,因为字符串不能是RDF三元组的主题

重写查询 我从的部分下载了。注意到has 10008之后,我导航到文件cache/epub/10008/pg10008.rdf,我看到这些数据缩写为相关部分:

<http://www.gutenberg.org/ebooks/10008>
        dcterms:creator    <http://www.gutenberg.org/2009/agents/1635> , <http://www.gutenberg.org/2009/agents/247> ;
        dcterms:title      "The Mystery" .

<http://www.gutenberg.org/2009/agents/1635>
        pgterms:alias      "Fabian, Warner" ;
        pgterms:name       "Adams, Samuel Hopkins" .

<http://www.gutenberg.org/2009/agents/247>
        pgterms:name       "White, Stewart Edward" .
清理查询 上面的查询足以让您继续,但实际上您可以使其更加简洁

空白节点 由于您没有投影?creator_i和?creator_j的值,因此实际上可以在此处使用空白节点;而不是写:

?work dcterms:title ?title ;
      dcterms:creator ?creator_i .
?creator pgterms:name ?name_i .
你可以写

?work dcterms:title ?title ;
      dcterms:creator [ pgterms:name ?name_i ] .
属性路径 由于您只关心创建者的一个属性,因此可以使用属性路径将其缩短:

?work dcterms:title ?title ;
      dcterms:creator/pgterms:name ?name_i .
最终结果 完成此操作后,您将得到以下查询和结果:

prefix dcterms: <http://purl.org/dc/terms/> 
prefix pgterms: <http://www.gutenberg.org/2009/pgterms/> 

select ?title ?name_i ?name_j where {
  ?work dcterms:title ?title ;
        dcterms:creator/pgterms:name ?name_i .
  optional { 
    ?work dcterms:creator/pgterms:name ?name_j .
    filter( ?name_i != ?name_j )
  }
}
文字不能是主题: 你没有准确地向我们展示数据或结果。如果数据的格式为:

 S1 pp:title "TITLE11"
 S1 pp:creator "CREATOR11"
 S1 pp:creator "CREATOR12"
 S2 pp:title "TITLE21"
 S2 pp:creator "CREATOR21"
 S2 pp:creator "CREATOR22"
 S2 pp:creator "CREATOR23"
S1 pp:title "TITLE11"
S1 pp:creator "CREATOR11"
S1 pp:creator "CREATOR12"
如果creator属性的值是字符串,那么您不应该为其获取任何匹配项

?s pp:creator ?ID1.
?ID1 ?p ?autor1.
因为?ID1将绑定到一个字符串,然后第二行不能有任何匹配项,因为字符串不能是RDF三元组的主题

重写查询 我从的部分下载了。注意到has 10008之后,我导航到文件cache/epub/10008/pg10008.rdf,我看到这些数据缩写为相关部分:

<http://www.gutenberg.org/ebooks/10008>
        dcterms:creator    <http://www.gutenberg.org/2009/agents/1635> , <http://www.gutenberg.org/2009/agents/247> ;
        dcterms:title      "The Mystery" .

<http://www.gutenberg.org/2009/agents/1635>
        pgterms:alias      "Fabian, Warner" ;
        pgterms:name       "Adams, Samuel Hopkins" .

<http://www.gutenberg.org/2009/agents/247>
        pgterms:name       "White, Stewart Edward" .
清理查询 上面的查询足以让您继续,但实际上您可以使其更加简洁

空白节点 由于您没有投影?creator_i和?creator_j的值,因此实际上可以在此处使用空白节点;而不是写:

?work dcterms:title ?title ;
      dcterms:creator ?creator_i .
?creator pgterms:name ?name_i .
你可以写

?work dcterms:title ?title ;
      dcterms:creator [ pgterms:name ?name_i ] .
属性路径 由于您只关心创建者的一个属性,因此可以使用属性路径将其缩短:

?work dcterms:title ?title ;
      dcterms:creator/pgterms:name ?name_i .
最终结果 完成此操作后,您将得到以下查询和结果:

prefix dcterms: <http://purl.org/dc/terms/> 
prefix pgterms: <http://www.gutenberg.org/2009/pgterms/> 

select ?title ?name_i ?name_j where {
  ?work dcterms:title ?title ;
        dcterms:creator/pgterms:name ?name_i .
  optional { 
    ?work dcterms:creator/pgterms:name ?name_j .
    filter( ?name_i != ?name_j )
  }
}

问题重复在问题重复在是看起来我使用的是旧的数据格式。我将尝试新的,我会看看它会得到什么…是的,它看起来像我在使用旧的数据格式。我会尝试新的,我会看看会得到什么。。。