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中,有没有一种方法可以获得两个以上关系方向未知的随机节点之间的路径_Neo4j_Cypher - Fatal编程技术网

在neo4j中,有没有一种方法可以获得两个以上关系方向未知的随机节点之间的路径

在neo4j中,有没有一种方法可以获得两个以上关系方向未知的随机节点之间的路径,neo4j,cypher,Neo4j,Cypher,我有一个场景,其中我有两个以上的随机节点 我需要获得连接所有三个节点的所有可能路径。我不知道关系的方向和关系类型 示例:我在图形数据库中有三个节点个人->购买->产品 我需要得到连接这三个节点的路径。但是我不知道我需要查询的顺序,例如,如果我以个人产品购买的方式进行查询,它将不会返回任何行,因为订单不正确 那么在这种情况下,我应该如何构建查询 简言之,我需要找到两个以上节点之间的路径,其中match子句可能会以用户知道的顺序被提及。不接受多次查询吗?在您的情况下,您将自动生成6个具有所有可能组合

我有一个场景,其中我有两个以上的随机节点

我需要获得连接所有三个节点的所有可能路径。我不知道关系的方向和关系类型

示例:我在图形数据库中有三个节点
个人->购买->产品

我需要得到连接这三个节点的路径。但是我不知道我需要查询的顺序,例如,如果我以个人产品购买的方式进行查询,它将不会返回任何行,因为订单不正确

那么在这种情况下,我应该如何构建查询


简言之,我需要找到两个以上节点之间的路径,其中match子句可能会以用户知道的顺序被提及。

不接受多次查询吗?在您的情况下,您将自动生成6个具有所有可能组合的查询(变量数量的阶乘)

您可以在
开始
中列出多个绑定标识符中的所有节点,然后您的
匹配
将以任何顺序找到匹配的节点。如果需要的话,您可以对N个项目执行此操作。例如,下面是对3个项目的查询:

start a=node:node_auto_index('name:(person product purchase)'), 
      b=node:node_auto_index('name:(person product purchase)'), 
      c=node:node_auto_index('name:(person product purchase)') 
match p=a-->b-->c 
return p;

实际上,我刚刚发表了一篇关于
start
如何工作的博文,这可能会有所帮助:

一个可能的解决方案是首先获得三组节点(
s
m
e
)。这些集合可能与问题中的相同(或包含部分或完全不同的节点)。这些集合很重要,因为起始节点、中间节点和结束节点不是固定的

以下是添加了节点的的的代码

match (s) where s.name in ["Oracle", "Neo", "Cypher"]
match (m) where m.name in ["Oracle", "Neo", "Cypher"] and s <> m 
match (e) where e.name in ["Oracle", "Neo", "Cypher"] and s <> e and m <> e 
match rel=(s)-[r1*1..]-(m)-[r2*1..]-(e)
return s, r1, m, r2, e, rel;
匹配s.name在[“Oracle”、“Neo”、“Cypher”]
匹配(m),其中m.name在[“Oracle”、“Neo”、“Cypher”]和s m中
匹配(e),其中e.name在[“Oracle”、“Neo”、“Cypher”]和SE和ME中
匹配rel=(s)-[r1*1..]-(m)-[r2*1..]-(e)
返回s、r1、m、r2、e、rel;
附加的
where
子句确保同一节点不会在一个结果行中使用两次。 这些关系分别与节点
s
m
m
e
之间的一条或多条边(
*1..
)或跃点匹配,而不考虑方向


请注意,这里使用的是cypher 3语法。

我不明白这一点。您可以使用创建和共享一个示例图吗?在控制台的默认矩阵示例中,我创建了一个新节点Oracle,Trinity->(knows)Oracle和Architect->(knows)Oracle开始n=node:node\u auto\u index(name='Trinity'),m=node:node\u auto\u index(name='the Architect')create(Oracle{name:'Oracle'}),n-[:knows]>Oracle,m-[:knows]->Oracle当我查询连接Neo、Oracle和Cypher的路径时,我应该得到Neo->(知道)Morpheus->(知道)Cypher->(知道)代理Smith->(知道)架构师->(知道)Oracle和Neo->(爱)Trinity->(知道)Oracle您可以使用控制台共享您的数据集吗?更简单。基于Wes Freeman创建数据集和查询。此查询返回72行。[.任何更好的方法都会对我有所帮助。我不想这样做,因为如果节点数量增加,那么可能的组合数量也会增加,因此我查询数据库的次数也会增加。这是一种开销。相反,有没有一种方法可以实现我的情况?如果你不知道顺序,你必须尝试所有的可能性。你真的没有作为一个选择,我怀疑你能找到一个“魔术”把戏。Wes上面的回答可能是最干净的方法,但它也测试了所有可能的组合。非常感谢。这非常有用。我提供了我在这里使用的数据集。查询返回72行(我想所有路径都是相同的)。[.但是有没有办法只得到一条最短的路径,这是最好的匹配。执行查询时有时也会出现错误*错误:org.neo4j.kernel.guard.GuardOperationsCountException:max ops(ops=10001)*。请给出建议。控制台对您可以运行的ops数量有限制(因此不会让服务器崩溃)--这真的是针对小型图形示例的。好的。但我在输出中得到了72行。我在查询中是否犯了任何错误?或者有更好的方法来重新表述我的查询吗?您链接的控制台上有一个Neo示例……您能试着再次共享吗?我认为实际上有很多不同的方法可以找到这些路径,使用您的va可变长度路径。