2016-12-05 33 views
0

我插入使用Node.js的API测试文档:如何使用SPARQL查询Marklogic三元组?

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控制台web应用程序通过SPARQL查询它:

SELECT ?s ?p ?o 
    WHERE { ?s ?p ?o } 

上面的查询工作正常,它检索测试三重我上面插入

但是,如果我想用文字值“巴黎”来过滤,我试过如下:

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

SELECT ?s ?p 
    WHERE { ?s ?p loc:Paris } 

但在这种情况下,我得到零结果。这个语法不正确?我只是下面的查询中https://docs.marklogic.com/guide/semantics/semantic-searches

是什么做的正确方法是什么样子?

回答

4

你提到这个博客文章: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" 
     } 
    }] 
} 

通过使用内部的主语,谓语和/或对象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!

+0

优秀。谢谢! –