0

我尝试在我的项目中使用 Neo4J 图形数据库,并尝试向您解释我的问题。

我想在每个结果的右侧和左侧都有最长的路径,在 8 个节点的限制内。但我不知道图表每一端的最后一个节点

下图是一个基本示例。我的图表像链一样构建,如下所示:

我的数据库 - Neo4j 图

我的问题是找到左右节点。使用这个虚拟查询,我有重复的结果

MATCH p=((nl)<-[:PREV*0..8]-(i)-[:NEXT*0..8]->(nr)) RETURN nodes(p);

这会返回太多重复的结果。这里有一些结果样本:

i
h | i
g | h | i
...
i | j
i | j | k
...
h | i | j
h | i | j | k
...
a | b | c | d | e | f | g | h | i | j | k | l | m | n | o | p | q

最后一个结果是唯一让我感兴趣的结果。

似乎 Neo4j 在 8 个限制内返回所有可能的节点组合到左侧和右侧。

附加信息:

  • 可以有多个“中间节点”(示例中的“i”)
  • 我想要左边 8 个节点,右边 8 个或更少,但总是两边的最大节点数

是否可以使用 Cypher 执行此操作?

4

1 回答 1

0

如果您只需要一个,则按路径长度排序并限制为单个结果:

MATCH p=((nl)<-[:PREV*0..8]-(i)-[:NEXT*0..8]->(nr)) 
WITH p
ORDER BY length(p) DESC
LIMIT 1
RETURN nodes(p);

或者,您可以在每一侧匹配和聚集:

MATCH p=(nl)<-[:PREV*0..8]-(i)
WITH i, nl
ORDER BY length(p) DESC
WITH i, collect(nl) as nodes
MATCH p = (i)-[:NEXT*1..8]->(nr)
WITH nodes, i, nr
ORDER BY length(p) ASC
WITH i, nodes + collect(nr) as nodes
RETURN nodes;
于 2018-07-16T09:58:15.733 回答