在neo4j中,有一种方法可以获得超过2个随机节点之间的路径,这些节点的关系方向是未知的

时间:2013-03-15 09:21:00

标签: neo4j cypher

我有一个场景,我有超过2个随机节点。

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

示例:我在图数据库中有三个节点person->Purchase->Product

我需要获取连接这三个节点的路径。但我不知道我需要查询的顺序,例如,如果我将查询作为person-Product-Purchase提供,则由于顺序不正确,它将不返回任何行。

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

简而言之,我需要找到两个以上节点之间的路径,其中可以按照用户知道的顺序提及匹配子句。

3 个答案:

答案 0 :(得分:2)

您可以列出start中多个绑定标识符中的所有节点,然后您的match会按任意顺序找到匹配的节点。如果需要,您可以为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;

http://console.neo4j.org/r/tbwu2d

我实际上刚刚撰写了一篇关于start如何运作的博客文章,这可能有所帮助:
http://wes.skeweredrook.com/cypher-it-all-starts-with-the-start/

答案 1 :(得分:0)

进行多次查询是否可以接受?在您的情况下,您将自动生成包含所有可能组合的6个查询(对变量数量进行因子分析)

答案 2 :(得分:0)

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

以下是添加了节点的Matrix example的代码。

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;

附加where子句确保在一个结果行中不使用相同的节点两次。 这些关系分别与节点*1..smm之间的一个或多个边(e)或跃点匹配,并忽略方向。

请注意,此处使用了cypher 3语法。