如何使用SPARQL查询Marklogic三元组?

如何使用SPARQL查询Marklogic三元组?,sparql,marklogic,Sparql,Marklogic,我使用Node.js API插入了一个测试文档: db.documents.write( { uri: "/test/doc1.json", contentType: "application/json", collections: "test", content: { name : "Peter", "triple": { "subject

我使用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 console webapp上通过SPARQL查询它:

SELECT ?s ?p ?o
  WHERE { ?s ?p ?o }
上面的查询工作正常,它检索上面插入的测试三元组I

但是,如果我想按文字值“Paris”进行过滤,我尝试了以下方法:

PREFIX loc: <http://example.com/location/>

SELECT ?s ?p 
  WHERE { ?s ?p loc:Paris }
前缀loc:
选择?s?p
哪里{s?p loc:Paris}
但在这种情况下,我没有得到任何结果。这个语法不正确吗?我只是在跟踪查询结果


正确的方法是什么?

您提到了这篇博客文章:

不幸的是,这并不是最好的例子。编写三元组的更好方法是:

{
    "triples": [{
        "triple": {
            "subject": "http://dbpedia.org/resource/Argo_(2012_film)",
            "predicate": "http://dbpedia.org/ontology/producer",
            "object": "http://dbpedia.org/resource/George_Clooney"
        }
    }]
}
通过在主语、谓语和/或宾语中使用
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"
        }

您提到了这篇博客文章:

不幸的是,这并不是最好的例子。编写三元组的更好方法是:

{
    "triples": [{
        "triple": {
            "subject": "http://dbpedia.org/resource/Argo_(2012_film)",
            "predicate": "http://dbpedia.org/ontology/producer",
            "object": "http://dbpedia.org/resource/George_Clooney"
        }
    }]
}
通过在主语、谓语和/或宾语中使用
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"
        }

好极了。谢谢杰出的谢谢