繁体   English   中英

如何在Sesame 2.7.7上的INSERT查询中自动生成新的实例标识符

[英]How to automatically generate new instance identifier in INSERT query on Sesame 2.7.7

我在使用SPARQL查询进行三元组自动实例化时遇到了识别问题。 让我们通过这个例子来看问题。

假设我们有以下三元组集代表人和他们的除草关系。

ns:Person rdf:type        owl:Class
ns:Man    rdfs:subClassOf ns:Person
ns:Woman  rdfs:subClassOf ns:Person
ns:Family rdf:type        owl:Class

ns:jean  rdf:type ns:Man
ns:roger rdf:type ns:Man
ns:chris rdf:type ns:Woman
ns:sofy  rdf:type ns:Woman
ns:chloe rdf:type ns:Woman

ns:jean  ns:isMarriedWith ns:chris
ns:roger ns:isMarriedWith ns:chloe

好的,现在我们想要使用两个人结婚时的家庭规则自动建立家庭。

IF (ns:A ns:isMarriedWith ns:B) 
THEN (ns:f rdf:type Family) 
     AND (ns:f ns:contains A)
     AND (ns:f ns:contains B)    

这是我建议在http sesame存储库上执行的Java代码。

Repository myRepository = new HTTPRepository(serverURL, repositoryId);
myRepository.initialize();
RepositoryConnection con = myRepository.getConnection();

query = "INSERT {" 
      + "   ns:f0 rdf:type    ns:Family ."
      + "   ns:f0 ns:contains ?p ."
      + "   ns:f0 ns:contains ?q ."
      + "}"
      + "WHERE { "
      + "   ?p ns:isMarriedWith ?q ."
      + "}";

Update update = con.prepareUpdate(QueryLanguage.SPARQL, query);    
update.execute();      

这是插入的三胞胎

ns:f0 rdf:type    ns:Family
ns:f0 ns:contains ns:jean
ns:f0 ns:contains ns:chris
ns:f0 ns:contains ns:roger
ns:f0 ns:contains ns:chloe

此结果不正确,因为只创建了一个族。 问题是,在WHERE子句匹配的任何时候,familly实例的标识都不会改变。

我怎样才能调整上面的代码,以便有正确的响应。

ns:f0 rdf:type    ns:Family
ns:f0 ns:contains ns:jean
ns:f0 ns:contains ns:chris
ns:f1 rdf:type    ns:Family
ns:f1 ns:contains ns:roger
ns:f1 ns:contains ns:chloe

谢谢 !

如果你提供我们可以使用的数据和代码不必添加大量的东西来完成它,那么回答这类问题容易得多 例如,提供完整的RDF文档。 你的数据是这样的(在Turtle中):

@prefix ns: <http://stackoverflow.com/q/20287293/1281433/> .
@prefix owl:   <http://www.w3.org/2002/07/owl#> .
@prefix xsd:   <http://www.w3.org/2001/XMLSchema#> .
@prefix rdf:   <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs:  <http://www.w3.org/2000/01/rdf-schema#> 

ns:Person a owl:Class .
ns:Man rdfs:subClassOf ns:Person .
ns:Woman rdfs:subClassOf ns:Person .
ns:Family a owl:Class .

ns:jean  a ns:Man .
ns:roger a ns:Man .
ns:chris a ns:Woman .
ns:sofy  a ns:Woman .
ns:chloe a ns:Woman .

ns:jean  ns:isMarriedWith ns:chris .
ns:roger ns:isMarriedWith ns:chloe .

在您的SPARQL查询中,不清楚f0是什么,因为它不是合法的SPARQL语法,但根据您对问题的描述,您将得到如下内容。 我已经改为construct查询,以便我们可以查看查询的结果并查看构造的三元组,这与插入的三元组相同。 这样可以更容易地看到发生了什么。

prefix ns:    <http://stackoverflow.com/q/20287293/1281433/> 
prefix owl:   <http://www.w3.org/2002/07/owl#> 
prefix xsd:   <http://www.w3.org/2001/XMLSchema#> 
prefix rdf:   <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
prefix rdfs:  <http://www.w3.org/2000/01/rdf-schema#> 
prefix : <urn:ex:>

construct {
  :f0 a ns:Family .     # This can be written as 
  :f0 ns:contains ?p .  # :f0 a ns:Family ; ns:contains ?p, ?q .
  :f0 ns:contains ?q .  #
}
where {
  ?p ns:isMarriedWith ?q .
}

现在,您的问题是,当您对该数据运行此查询时,您会得到如下结果:

:f0     a            ns:Family ;
        ns:contains  ns:chris , ns:jean , ns:chloe , ns:roger .

那里是一个包含所有四个人一个家庭,但你想有一个不同的家庭的一对。 诀窍是用一个空节点替换常量 :f0 ,这对于查询中的每个匹配都是唯一的。 你可以通过改变:f0_:f0来做到这一点:

  _:f0 a ns:Family .   
  _:f0 ns:contains ?p .
  _:f0 ns:contains ?q .

但我更愿意使用我们可以获得的更多的语法糖,并写下:

[ a ns:Family ; ns:contains ?p, ?q ]

所以我们有:

prefix ns:    <http://stackoverflow.com/q/20287293/1281433/> 
prefix owl:   <http://www.w3.org/2002/07/owl#> 
prefix xsd:   <http://www.w3.org/2001/XMLSchema#> 
prefix rdf:   <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
prefix rdfs:  <http://www.w3.org/2000/01/rdf-schema#> 

prefix : <urn:ex:>

construct {
  _:f0 a ns:Family ; ns:contains ?p, ?q .
}
where {
  ?p ns:isMarriedWith ?q .
}

此查询的结果包含两个不同的系列:

@prefix :      <urn:ex:> .
@prefix rdfs:  <http://www.w3.org/2000/01/rdf-schema#> .
@prefix ns:    <http://stackoverflow.com/q/20287293/1281433/> .
@prefix owl:   <http://www.w3.org/2002/07/owl#> .
@prefix xsd:   <http://www.w3.org/2001/XMLSchema#> .
@prefix rdf:   <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .

[ a            ns:Family ;
  ns:contains  ns:chris , ns:jean
] .

[ a            ns:Family ;
  ns:contains  ns:chloe , ns:roger
] .
<rdf:RDF
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:ns="http://stackoverflow.com/q/20287293/1281433/"
    xmlns:owl="http://www.w3.org/2002/07/owl#"
    xmlns="urn:ex:"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
    xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#">
  <ns:Family>
    <ns:contains rdf:resource="http://stackoverflow.com/q/20287293/1281433/chris"/>
    <ns:contains rdf:resource="http://stackoverflow.com/q/20287293/1281433/jean"/>
  </ns:Family>
  <ns:Family>
    <ns:contains rdf:resource="http://stackoverflow.com/q/20287293/1281433/chloe"/>
    <ns:contains rdf:resource="http://stackoverflow.com/q/20287293/1281433/roger"/>
  </ns:Family>
</rdf:RDF>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM