文字不能是主语:
您没有准确地向我们展示数据或结果。如果数据实际上是以下形式:
S1 pp:title "TITLE11"
S1 pp:creator "CREATOR11"
S1 pp:creator "CREATOR12"
如果creator 属性的值是字符串,那么您不应该得到 任何 匹配
?s pp:creator ?ID1.
?ID1 ?p ?autor1.
因为?ID1 会绑定到一个字符串,然后第二行就不能有任何匹配项,因为字符串不能是 RDF 三元组的主题。
重写查询
我从RDF data available from Project Gutenberg 的Current RDF Format 部分下载了rdf-files.tar.bz2。在注意到The Mystery 有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" .
值得注意的是,我在该文件中没有看到任何rdf:Bag 的使用。也许您正在使用也可以下载的旧 RDF 格式。如果您承诺使用该数据,请添加评论,我们也可以进行这项工作,但在可用的地方使用更新的数据似乎是有益的,因此我将继续使用这些数据。
如果您希望每个标题与每个作者组合一起列出,您可以使用如下查询来获取结果。 (我注意到你说你希望重复作者。这对我来说似乎有点不寻常,所以我添加了一个过滤器来删除它们,但如果你真的想要 ?name_i 和 ?name_j,你可以简单地删除过滤器能够绑定到相同的值。)
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 ?creator_i .
?creator_i pgterms:name ?name_i .
optional {
?work dcterms:creator ?creator_j .
?creator_j pgterms:name ?name_j .
filter( ?creator_i != ?creator_j )
}
}
---------------------------------------------------------------------
| title | name_i | name_j |
=====================================================================
| "The Mystery" | "Adams, Samuel Hopkins" | "White, Stewart Edward" |
| "The Mystery" | "White, Stewart Edward" | "Adams, Samuel Hopkins" |
---------------------------------------------------------------------
清理查询
上面的查询足以让你开始,但实际上你可以让它更简洁一些。
空白节点
由于您没有投影?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 )
}
}
---------------------------------------------------------------------
| title | name_i | name_j |
=====================================================================
| "The Mystery" | "Adams, Samuel Hopkins" | "White, Stewart Edward" |
| "The Mystery" | "White, Stewart Edward" | "Adams, Samuel Hopkins" |
---------------------------------------------------------------------