0

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

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

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

我需要得到连接这三个节点的路径。但我不知道我需要查询的顺序,例如,如果我将查询作为 person-Product-Purchase,它不会返回任何行,因为顺序不正确。

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

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

4

3 回答 3

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/

于 2013-03-15T20:51:57.730 回答
0

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

于 2013-03-15T11:42:07.403 回答
0

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

这是带有添加节点的Matrix 示例的代码。

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..节点之间的s一条m或多条边(me

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

于 2016-11-03T16:26:42.983 回答