【问题标题】:SPARQL zick-zack pattern querySPARQL zick-zack 模式查询
【发布时间】:2016-06-07 23:04:21
【问题描述】:

我有一个模仿 zick-zack 模式的 SPARQL 查询,如下所示。

?p1 :infector ?p.
?p2 :infector ?p1.
?p3 :infector ?p2.
?p4 :infector ?p3.
?p5 :infector ?p4
.................

基本上,在一个三元组的模式主题中用作下一个三元组的宾语。有没有办法概括这种模式?因此,我不需要在模式中使用一长串变量 (?p-?p5)。另外,在多次运行查询之前,我不知道我需要多少这样的变量。因此,我无法想出一组已定义的变量。我需要一些通用的东西。如果您有任何想法使此查询通用,请告诉我。我将非常感谢任何帮助。

澄清:

我有一个如下所示的 RDF 图。

<http://ndssl.bi.vt.edu/chicago/dendrogram/experiment_id#7385/cell_id#86304/infectee_pid#446734805/iteration#0> <http://ndssl.bi.vt.edu/chicago/vocab/dendrogram_infector_pid> <http://ndssl.bi.vt.edu/chicago/person/pid#449563560>.

<http://ndssl.bi.vt.edu/chicago/dendrogram/experiment_id#7385/cell_id#86304/infectee_pid#446734805/iteration#0> <http://ndssl.bi.vt.edu/chicago/vocab/dendrogram_infectee_pid> <http://ndssl.bi.vt.edu/chicago/person/pid#446734805>

<http://ndssl.bi.vt.edu/chicago/dendrogram/experiment_id#7385/cell_id#86304/infectee_pid#446753456/iteration#0> <http://ndssl.bi.vt.edu/chicago/vocab/dendrogram_infector_pid> <http://ndssl.bi.vt.edu/chicago/person/pid#446734805>.

<http://ndssl.bi.vt.edu/chicago/dendrogram/experiment_id#7385/cell_id#86304/infectee_pid#446753456/iteration#0> <http://ndssl.bi.vt.edu/chicago/vocab/dendrogram_infectee_pid> <http://ndssl.bi.vt.edu/chicago/person/pid#446753456>.

.......................................................................

以下 SPARQL 查询可以获取上述 RDF 图中提到的现有链。

select * from <http://ndssl.bi.vt.edu/chicago/> where
where { 
{
?s <http://ndssl.bi.vt.edu/chicago/vocab/dendrogram_infector_pid> ?o1.
?s <http://ndssl.bi.vt.edu/chicago/vocab/dendrogram_infectee_pid> ?o2
}

{
?s1 <http://ndssl.bi.vt.edu/chicago/vocab/dendrogram_infector_pid> ?o2.
?s1 <http://ndssl.bi.vt.edu/chicago/vocab/dendrogram_infectee_pid> ?o3
}
 ..........................................................................

}

这种链式查询包含两部分,其中来自查询第一部分的感染者 ID 用作第二部分的感染者。在我的查询中,我有很多部分。有什么方法可以概括它吗?因此,使用这么多部件的插入,我可以只使用一个部件并获得结果。顺便说一句,我还需要路径长度和中间节点信息。

【问题讨论】:

  • 感谢您的回复。我还需要知道路径长度和中间节点信息。链接中提供的解决方案未提供该信息。
  • 我明白了。这更接近你的问题吗? stackoverflow.com/q/4056008/824425
  • 今天我了解到 zigzag(美式英语)在世界其他一些地方是 zickzack。 :)

标签: sparql rdf jena virtuoso sparqlwrapper


【解决方案1】:

基本上,在一个三元组的模式主语中,用作宾语 下一个。有什么方法可以概括这种模式?

首先,请注意,如果您从另一个方向考虑您的三重模式,那么它就不是锯齿形,而只是一条链:

?p5 :infector ?p4 .
?p4 :infector ?p3 .
?p3 :infector ?p2 .
?p2 :infector ?p1 .
?p1 :infector ?p0 .

使用重复属性路径很容易捕获:

?p5 :infector* ?p0

如果您想看到 ?p0 首先出现在查询文本中,可以通过反转属性路径的方向来反转方向:

?p0 ^:infector* ?p5

我还需要知道路径长度和中间节点信息。

既然你说的是“路径长度”,听起来你想要一条最大的路径。这让事情变得有点棘手,但你仍然可以这样做。您可以应用来自Is it possible to get the position of an element in an RDF Collection in SPARQL? 的方法。要获取从 ?begin 到 ?end 的路径长度,您可以执行以下操作:

select ?begin ?end (count(?mid) as ?length) {
  ?end :infector* ?mid .
  ?mid :infector* ?begin .
}
group by ?begin ?end

这将找到每个 :infector 路径的长度。如果您只想要最大路径,则需要确保路径不能从 ?begin 或 ?end 向任一方向延伸:

select ?begin ?end (count(?mid) as ?length) {
  ?end :infector* ?mid .
  ?mid :infector* ?begin .

  filter not exists { ?begin :infector ?beginEx }
  filter not exists { ?endEx :infector ?end }
}
group by ?begin ?end

这需要对 ?mid 变量进行分组,因此您无法在获得长度的同时获得关于中间节点的非聚合信息,但是当您 获取长度,可以获取中间节点的信息:

select * {
  ?end :infector* ?mid .
  ?mid :infector* ?begin .

  filter not exists { ?begin :infector ?beginEx }
  filter not exists { ?endEx :infector ?end }

  #-- information about ?mid, e.g,. 
  #-- ?mid rdfs:label ?midLabel . 
}

【讨论】:

  • 这不是我想要的。我发了一篇新帖子澄清了我的问题(stackoverflow.com/questions/37711732/sparql-chain-query)。带来不便敬请谅解。如果您对我的新帖子提供一些反馈,这将是一个很大的帮助。
  • 最好保持这个线程打开并编辑问题。
  • @S.M.ShamimulHasan 我同意 AKSW;如果您对这个问题有任何澄清,请先澄清这个问题,然后再创建一个新问题。
猜你喜欢
  • 2011-08-05
  • 1970-01-01
  • 2022-08-25
  • 2015-05-09
  • 2013-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-24
相关资源
最近更新 更多