SPARQL zick-zack模式查询

SPARQL zick-zack模式查询,sparql,rdf,jena,virtuoso,sparqlwrapper,Sparql,Rdf,Jena,Virtuoso,Sparqlwrapper,我有一个SPARQL查询,它模仿了zick-zack模式,如下所示 ?p1 :infector ?p. ?p2 :infector ?p1. ?p3 :infector ?p2. ?p4 :infector ?p3. ?p5 :infector ?p4 ................. <http://ndssl.bi.vt.edu/chicago/dendrogram/experiment_id#7385/cell_id#86304/infectee_pid#446734805/it

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

?p1 :infector ?p.
?p2 :infector ?p1.
?p3 :infector ?p2.
?p4 :infector ?p3.
?p5 :infector ?p4
.................
<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>.

.......................................................................
基本上,在一个三元组的模式中,主体用作下一个三元组的对象。有什么方法可以概括这种模式吗?因此,我不需要在模式中使用一长串变量(?p-?p5)。此外,在多次运行查询之前,我不知道需要多少这样的变量。因此,我无法提出一套已定义的变量。我需要一些普通的东西。如果你有任何想法使这个查询通用,那么请让我知道。我将非常感谢任何帮助

澄清: 我有一个RDF图,如下所示

?p1 :infector ?p.
?p2 :infector ?p1.
?p3 :infector ?p2.
?p4 :infector ?p3.
?p5 :infector ?p4
.................
<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
}
 ..........................................................................

}
从何处选择*
何处{
{
?sO1。
?s?o2
}
{
?s1?o2。
?s1?o3
}
..........................................................................
}
此查询链类型包含两个部分,其中来自查询第一部分的被感染者ID用作第二部分的感染者。在我的查询中,我有很多部分。有什么方法可以概括它吗?所以,在使用这么多部件的同时,我只需要使用一个部件就可以得到结果。顺便说一句,我需要路径长度和中间节点信息以及

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

首先,注意如果你把你的三重模式考虑在另一个方向上,那么它就不是一个字形,而是一个链:

?p5 :infector ?p4 .
?p4 :infector ?p3 .
?p3 :infector ?p2 .
?p2 :infector ?p1 .
?p1 :infector ?p0 .
通过重复属性路径很容易捕获:

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

?p5 :infector* ?p0
?p0 ^:infector* ?p5
我还需要知道路径长度和中间节点信息

既然你说的是“路径长度”,听起来你想要一条最大路径。这让事情变得有点棘手,但你仍然可以这样做。您可以从中应用该方法。要获取从?开始到?结束的路径长度,可以执行以下操作:

选择开始结束(计数(?中间)为长度){
?结束:感染者*?中期。
?中:感染者*?开始。
}
分组方式?开始?结束
这将找到每个:传染子路径的长度。如果您只需要最大路径,则需要确保路径不能从?开始或?结束向任何方向延伸:

选择开始结束(计数(?中间)为长度){
?结束:感染者*?中期。
?中:感染者*?开始。
筛选器不存在{?开始:感染者?开始}
筛选器不存在{?endEx:infector?end}
}
分组方式?开始?结束
这需要在?mid变量上进行分组,因此在获取长度的同时无法获取关于中间节点的非聚合信息,但如果无法获取长度,则可以获取关于中间节点的信息:

选择*{
?结束:感染者*?中期。
?中:感染者*?开始。
筛选器不存在{?开始:感染者?开始}
筛选器不存在{?endEx:infector?end}
#--有关?mid的信息,例如,。
#--?中间rdfs:标签?中间标签。
}

感谢您的回复,可能是重复的。我还需要知道路径长度和中间节点信息。链接中提供的解决方案不提供该信息。我明白了。这更接近你的问题吗?今天我学到了zigzag(在美国英语中)在世界其他一些地方是zickzack这不是我想要的。我发表了一篇新帖子,澄清了我的问题()。很抱歉给您带来不便。如果你能对我的新帖子提供一些反馈,这将是一个很大的帮助。最好保持这个帖子的开放性并编辑这个问题。@S.M.ShamimulHasan我同意AKSW;如果您对此问题有澄清,请先澄清此问题,然后再创建一个新问题。