Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在SPARQL构造查询中递归展开空白节点?_Sparql_Rdf_Semantic Web_Semantics_Blank Nodes - Fatal编程技术网

如何在SPARQL构造查询中递归展开空白节点?

如何在SPARQL构造查询中递归展开空白节点?,sparql,rdf,semantic-web,semantics,blank-nodes,Sparql,Rdf,Semantic Web,Semantics,Blank Nodes,对此可能有一个简单的答案,但我甚至不知道如何制定谷歌查询来找到它 我正在针对包含空白节点的数据集编写SPARQL构造查询。所以如果我做一个像这样的查询 构造{x?y?z.} 哪里{?x?y?z.} 那么我的一个结果可能是: nm:John nm:owns 3;:节点 这是一个问题,如果所有的 _:节点nm:has nm:Hats 三元组也不会以某种方式进入查询结果,因为我正在使用的一些解析器,如用于Python的rdflib,确实不喜欢挂起的bNode 有没有一种方法可以编写我的原始构造查询,以

对此可能有一个简单的答案,但我甚至不知道如何制定谷歌查询来找到它

我正在针对包含空白节点的数据集编写SPARQL构造查询。所以如果我做一个像这样的查询

构造{x?y?z.} 哪里{?x?y?z.}

那么我的一个结果可能是:

nm:John nm:owns 3;:节点

这是一个问题,如果所有的

_:节点nm:has nm:Hats

三元组也不会以某种方式进入查询结果,因为我正在使用的一些解析器,如用于Python的rdflib,确实不喜欢挂起的bNode


有没有一种方法可以编写我的原始构造查询,以递归方式添加附加到任何bnode结果的所有三元组,从而在我的新图形中没有bnode悬空

递归是不可能的。我能想到的最接近的是注意:该版本已经过时,但bnode测试目前还不可用

您可以删除带有尾随bNode的语句:

CONSTRUCT {?x ?y ?z .} WHERE 
{
  ?x ?y ?z .
  FILTER (!isBlank(?z))
}
或者试试运气,获取下一位:

CONSTRUCT {?x ?y ?z . ?z ?w ?v } WHERE 
{
  ?x ?y ?z .
  OPTIONAL {
    ?z ?w ?v
    FILTER (isBlank(?z) && !isBlank(?v))
  }
}
顺便说一句,最后一个问题是相当令人痛苦的


您最好使用descripe,它通常会跳过bnodes。

正如user205512所建议的,递归地执行抓取是不可能的,正如他们所指出的,使用optionals进入数据的任意级别获取节点在任何情况下都是不可行的,除了大小不小的数据库

bNode本身是本地范围的、结果集的或文件的。无法保证从解析中获得的BNode或从结果集中获得的BNode与数据库中使用的id相同,尽管某些数据库确实保证查询结果具有相同的id。此外,像select?s这样的查询,其中{s?p}:bnodeid1}与select?s相同?其中{s?p?o}-注意,在这种情况下,bnode被视为变量,而不是id为'bnodeid1'的东西。这种设计的怪癖使得查询bnode非常困难,因此,如果您控制着数据,我建议不要使用它们。为本来应该是bNode的东西生成名称并不难,命名为resources v。B节点在查询期间不会增加开销

这并不能帮助您递归并获取数据,但为此,我不建议您进行此类常规查询;它们不能很好地扩展,通常返回的比您想要或需要的更多。我建议你多做一些有针对性的询问。您最初的构造查询将下拉整个数据库的内容,这通常不是您想要的


最后,虽然descripe可能有用,但没有标准的实现;SPARQL规范没有定义任何特定的行为,因此它返回的内容留给数据库供应商,并且可能会有所不同。如果您计划在应用程序中尝试不同的数据库,那么这会降低代码的可移植性。如果你想要一个无法描述的特定行为,你最好自己去实现它。对资源进行简洁的有界描述是一段简单的代码,尽管您可能会遇到一些关于bNode的头痛问题。

关于使用ruby RDF.rb库,它允许SPARQL查询RDF::Graph对象,并使用非常方便的方法,下面应该扩展空白节点

例如,rdf_type=rdf::SCHEMA.Person 查询[nil,rdf.type,rdf_type]。每个_subject do|subject| g=RDF::Graph.new 查询[subject,nil,nil]do | s,p,o|
谢谢你的回答,迈克尔。我的示例查询有点不精确……我实际上要做的是从我下载的数据集中提取关于给定实体的所有信息。但该数据集包含的条目类似于约翰是u234;:1234的创建者。因此,我认为我的备选方案是使用两级查询,希望它不会破坏性能,或者只是重新构造数据库以命名所有bNode。SPARQL规范似乎可以对此使用更强大的支持,因为这似乎不是一个特别罕见的问题。感谢用户。我目前的计划是使用两级查询,而不必担心更深入的递归。isBlank过滤器可能会有所帮助,但过滤器似乎确实会影响性能,因为SPARQL似乎在逐行执行过滤器之前实现了整个预过滤器子图。因此,除非未过滤的子图很小,否则过滤查询将变得非常密集。你不能说SPARQL正在实现整个预过滤子图…:不同的SPARQL引擎实现将有不同的算法,具有不同的优缺点。根据所使用库的版本,它甚至会有所不同。如果您以可以运行构造查询然后对其运行SPARQL查询的方式执行此操作,那么您实际上可以使用SPARQL查询获得简明的有界描述CBD。看一看,也许吧。在前面的评论中,答案背后的想法是,您可以创建一个新属性,它可以有效地充当propert中的谓词 y路。例如,对于每个IRI节点i,添加一个三重i selfIRI i。然后,当您编写一个像?xp/selfIRI?y这样的路径时,您已经确保?y是一个IRI节点。