如何使用 SPARQL 查询 Marklogic 三元组?
How to query Marklogic triples using SPARQL?
我使用 Node.js API:
插入了一个测试文档
db.documents.write(
{
uri: "/test/doc1.json",
contentType: "application/json",
collections: "test",
content: {
name : "Peter",
"triple": {
"subject": {
"datatype": "http://example.com/name/",
"value": "Peter"
},
"predicate": {
"datatype": "http://example.com/relation/",
"value": "livesin"
},
"object": {
"datatype": "http://example.com/location/",
"value": "Paris"
}
}
}
}
).
result(function(response){
console.log("Done loading");
});
然后我尝试在 Marklogic 控制台 webapp 上通过 SPARQL 查询它:
SELECT ?s ?p ?o
WHERE { ?s ?p ?o }
上面的查询工作正常,它检索了我上面插入的测试三元组
但是,如果我想按文字值 "Paris" 进行过滤,我尝试了以下操作:
PREFIX loc: <http://example.com/location/>
SELECT ?s ?p
WHERE { ?s ?p loc:Paris }
但在这种情况下,我得到的结果为零。这个语法不正确吗?我只是关注查询在 https://docs.marklogic.com/guide/semantics/semantic-searches
中的样子
正确的做法是什么?
您引用了这篇博客文章:http://developer.marklogic.com/blog/managed-vs-unmanaged-triples
不幸的是,它没有展示最好的例子。一个更好的写三元组的方法是这样的:
{
"triples": [{
"triple": {
"subject": "http://dbpedia.org/resource/Argo_(2012_film)",
"predicate": "http://dbpedia.org/ontology/producer",
"object": "http://dbpedia.org/resource/George_Clooney"
}
}]
}
通过在主语、谓语 and/or 对象中使用 value
属性,您告诉 MarkLogic 将其作为值而不是 iri 来读取。因此,对于您的示例,您应该使用:
SELECT ?s ?p
WHERE {
?s ?p ?o.
FILTER( STR(?o) = "Paris" )
}
或者将您的 JSON 更改为:
"triple": {
"subject": "http://example.com/name/Peter",
"predicate":http://example.com/relation/livesin",
"object": http://example.com/location/Paris"
}
HTH!
我使用 Node.js API:
插入了一个测试文档 db.documents.write(
{
uri: "/test/doc1.json",
contentType: "application/json",
collections: "test",
content: {
name : "Peter",
"triple": {
"subject": {
"datatype": "http://example.com/name/",
"value": "Peter"
},
"predicate": {
"datatype": "http://example.com/relation/",
"value": "livesin"
},
"object": {
"datatype": "http://example.com/location/",
"value": "Paris"
}
}
}
}
).
result(function(response){
console.log("Done loading");
});
然后我尝试在 Marklogic 控制台 webapp 上通过 SPARQL 查询它:
SELECT ?s ?p ?o
WHERE { ?s ?p ?o }
上面的查询工作正常,它检索了我上面插入的测试三元组
但是,如果我想按文字值 "Paris" 进行过滤,我尝试了以下操作:
PREFIX loc: <http://example.com/location/>
SELECT ?s ?p
WHERE { ?s ?p loc:Paris }
但在这种情况下,我得到的结果为零。这个语法不正确吗?我只是关注查询在 https://docs.marklogic.com/guide/semantics/semantic-searches
中的样子正确的做法是什么?
您引用了这篇博客文章:http://developer.marklogic.com/blog/managed-vs-unmanaged-triples
不幸的是,它没有展示最好的例子。一个更好的写三元组的方法是这样的:
{
"triples": [{
"triple": {
"subject": "http://dbpedia.org/resource/Argo_(2012_film)",
"predicate": "http://dbpedia.org/ontology/producer",
"object": "http://dbpedia.org/resource/George_Clooney"
}
}]
}
通过在主语、谓语 and/or 对象中使用 value
属性,您告诉 MarkLogic 将其作为值而不是 iri 来读取。因此,对于您的示例,您应该使用:
SELECT ?s ?p
WHERE {
?s ?p ?o.
FILTER( STR(?o) = "Paris" )
}
或者将您的 JSON 更改为:
"triple": {
"subject": "http://example.com/name/Peter",
"predicate":http://example.com/relation/livesin",
"object": http://example.com/location/Paris"
}
HTH!