Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.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
Neo4j apoc返回的路径变形为分组数据_Neo4j_Cypher_Neo4j Apoc - Fatal编程技术网

Neo4j apoc返回的路径变形为分组数据

Neo4j apoc返回的路径变形为分组数据,neo4j,cypher,neo4j-apoc,Neo4j,Cypher,Neo4j Apoc,这是示例图的屏幕截图: 示例图形数据生成: CREATE (r:Red {key:'someid'}) CREATE (t1:Teal) CREATE (t2:Teal) CREATE (t3:Teal) CREATE (t4:Teal) CREATE (t5:Teal) CREATE (t6:Teal) CREATE (r2:Red) CREATE (b1:Blue) CREATE (b2:Blue) CREATE (b3:Blue) CREATE (b4:Blue) CREATE (f:F

这是示例图的屏幕截图:

示例图形数据生成:

CREATE (r:Red {key:'someid'})
CREATE (t1:Teal)
CREATE (t2:Teal)
CREATE (t3:Teal)
CREATE (t4:Teal)
CREATE (t5:Teal)
CREATE (t6:Teal)
CREATE (r2:Red)
CREATE (b1:Blue)
CREATE (b2:Blue)
CREATE (b3:Blue)
CREATE (b4:Blue)
CREATE (f:FINAL_NODE)
CREATE (r)<-[:TO_ACTIVE_DRAFT]-(t1)
CREATE (r)<-[:TO_ACTIVE_DRAFT]-(t2)
CREATE (r)<-[:TO_ACTIVE_DRAFT]-(t3)
CREATE (r)<-[:TO_ACTIVE_DRAFT]-(t4)
CREATE (r)<-[:TO_ACTIVE_DRAFT]-(t5)
CREATE (r)<-[:TO_ACTIVE_DRAFT]-(t6)
CREATE (t1)<-[:TO_ATL]-(r2)
CREATE (t2)<-[:TO_ATL]-(r2)
CREATE (t3)<-[:TO_ATL]-(r2)
CREATE (t4)<-[:TO_ATL]-(r2)
CREATE (t5)<-[:TO_ATL]-(r2)
CREATE (t6)<-[:TO_ATL]-(r2)
CREATE (r2)<-[:TO_ACTIVE_DRAFT]-(b1)
CREATE (r2)<-[:TO_ACTIVE_DRAFT]-(b2)
CREATE (r2)<-[:TO_ACTIVE_DRAFT]-(b3)
CREATE (r2)<-[:TO_ACTIVE_DRAFT]-(b4)
CREATE (b1)-[:TO_FINAL]->(f)
CREATE (b2)-[:TO_FINAL]->(f)
CREATE (b3)-[:TO_FINAL]->(f)
CREATE (b4)-[:TO_FINAL]->(f)
{}是每个节点和关系的属性

如果我使用

返回节点(p)

它只是给我一个没有深度的所有项目的列表,如果我尝试使用size或length和path,在这个例子中它们都是5,并且没有给我单独的节点

我真正想要的是能够重新创建图形的级别,因此理想情况下,数据将按如下方式返回:

MATCH (f:Red {key:'someid'}) 
CALL apoc.path.expand(f, '<TO_ACTIVE_DRAFT|<TO_ATL|TO_FINAL>', '>FINAL_NODE',-1,-1) yield path as p

RETURN p
[
  [
    {red}
  ],[
    {teal},
    {teal},
    {teal},
    {teal},
    {teal},
    {teal}
  ],[
    {red}
  ],[
    {blue},
    {blue},
    {blue},
    {blue},
    {blue},
    {blue},
    {blue}
  ],[
    {green}
  ]
]
MATCH (f:Red {key:'someid'})
p = OPTIONAL MATCH (f)<-[:TO_ACTIVE_DRAFT|TO_ATL*]-()-[:SOURCE_FOR_INC]->(g:Green)
RETURN p
这是否可以使用expand函数实现,或者我是否需要找出如何通过cypher对标准模式执行相同的操作-即匹配(r)-[:*]-(最终)

//两项澄清: 可以有任意数量的路由和节点。在这个例子中,它是红色,青色,红色,蓝色,绿色。它可以是红色,青色,红色,青色,红色,蓝色,绿色。可以是红色,蓝色,绿色

我使用的是C#和neo4j驱动程序,如果这对我可以得到返回的数据有影响的话,比如我从C中返回的路径得到的响应#

[补充澄清]

一个更具体的例子是,如果你在移动动物,你有一个出生来源,然后你有几个动作,直到你到达市场。因此,该图看起来像是初始屏幕截图,其中红色节点是动物移动到的特定位置,蓝色和蓝色节点是不同类型的时间表。然而,我唯一能确定的信息是它目前在什么位置(所以是哪个红色节点),我想找到出生的源头(绿色节点)。它所处的移动次数和位置是可变的。它可能移动了一次,也可能移动了x次。我确实倾向于知道路径仅限于3个标记的关系。所以,虽然我非常喜欢apoc过程的语法,但如果我在得到它之后无法操作该路径,那么也许我只需要做如下操作

MATCH (f:Red {key:'someid'})
OPTIONAL MATCH (f)<-[:TO_ACTIVE_DRAFT|TO_ATL*]-()-[:SOURCE_FOR_INC]->(g:Green)
RETURN g
MATCH(f:Red{key:'someid'})
可选匹配(f)(g:绿色)
返回g
但对我来说,上面的结果只返回f或g,而不是路径,所以它必须是这样的:

MATCH (f:Red {key:'someid'}) 
CALL apoc.path.expand(f, '<TO_ACTIVE_DRAFT|<TO_ATL|TO_FINAL>', '>FINAL_NODE',-1,-1) yield path as p

RETURN p
[
  [
    {red}
  ],[
    {teal},
    {teal},
    {teal},
    {teal},
    {teal},
    {teal}
  ],[
    {red}
  ],[
    {blue},
    {blue},
    {blue},
    {blue},
    {blue},
    {blue},
    {blue}
  ],[
    {green}
  ]
]
MATCH (f:Red {key:'someid'})
p = OPTIONAL MATCH (f)<-[:TO_ACTIVE_DRAFT|TO_ATL*]-()-[:SOURCE_FOR_INC]->(g:Green)
RETURN p
MATCH(f:Red{key:'someid'})
p=可选匹配(f)(g:绿色)
返回p
我相信这将为我提供路径,但与apoc相同,我无法将数据变形为组…

此查询(带有一些假定的节点标签)不使用apoc过程,可能适用于您:

MATCH (f:Node {key:'someid'})
  <-[:TO_ACTIVE_DRAFT]-(t:Teal)
  <-[:ATL_TO_DRAFT]-(r:Red)
  <-[:TO_ACTIVE_DRAFT]-(b:Blue)
  -[:SOURCE_FOR_INC]->(g:Green)
RETURN COLLECT(DISTINCT f), COLLECT(DISTINCT t), COLLECT(DISTINCT r), COLLECT(DISTINCT b), COLLECT(DISTINCT g)
MATCH(f:Node{key:'someid'})

应该可以设计出密码,但这需要一些努力,而且可能相当复杂

您最好只考虑以下结果:

MATCH p=(f:Red {key:'someid'}<-[:TO_ACTIVE_DRAFT|TO_ATL*]-()-[:SOURCE_FOR_INC]->(g:Green)
RETURN p
MATCH p=(f:Red{key:'someid'}(g:Green)
返回p
并用某种外部编程语言生成所需的数据。
大多数情况下,路径是人们想要的,因此Cypher正致力于此。

不幸的是,我没有一条保证的路径,但这正是我试图返回的。我用这一澄清和样本数据生成更新了问题。似乎在所有apoc示例中,他们基本上只返回生成的结果,而不执行任何操作我希望能够创建一个类似于浏览器UI中生成的图形,但只有某些属性。这意味着试图知道节点“适合”的位置,但在将其移动到节点时,我似乎失去了所有上下文,并且不确定返回的“路径”有什么好处isI不会专注于特定的APOC过程,因为它可能太复杂,无法以您想要的格式获得其结果。似乎使用原始密码应该有效。但仍然不清楚您的用例是什么。无论何时进行查询,您是否希望所有匹配路径都具有相同的模式(关于节点和关系的顺序)?@cybersam在本例中,我知道我想要到达某个标记的节点。在我上面的示例中,我将其称为FINAL_node。在到FINAL_node的路线中,从我所在的位置遍历,我知道它将有两种类型的关系,然后是最终类型的关系(第三种类型)将是一个不同的方向。在apoc查询中,我要求对您的一般用例进行更清晰的描述(不是您问题中显示的具体用例,我已经提供了答案),因为您似乎希望得到答案。@cybersam在帖子的末尾,我在下面添加了一些额外的澄清“补充澄清"。这实际上是关于中间部分的可变模式以及能够操纵数据。似乎基于您的回答和回答,当路径数据是可变模式时,操纵路径数据通常不是简单或常见的。我很欣赏在这方面的来回和花费的时间。如果您没有发现任何问题,也没有问题。我会想出一种不同的方法来编写密码应该是可能的,但这需要一些努力,而且可能相当复杂。您最好只获取
MATCH p=(f:Red{key:'someid'}(g:Green)的结果返回p
,并用某种外部编程语言生成所需的数据。大多数情况下,路径是人们想要的,因此Cypher正致力于此。