为什么下面的sparql查询不返回笛卡尔乘积
我是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
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 )
}
}
问题重复在问题重复在是看起来我使用的是旧的数据格式。我将尝试新的,我会看看它会得到什么…是的,它看起来像我在使用旧的数据格式。我会尝试新的,我会看看会得到什么。。。