如何用cypher和neo4j匹配左右节点
how to match right and left nodes with cypher and neo4j
我尝试在我的项目中使用 Neo4J 图形数据库,我将尝试向您解释我的问题。
我想要最长的路径,在 8 个节点的限制内,在每个结果的左右两侧。但是我不知道图表每一端的最后一个节点
下图是一个基本示例。我的图表像链条一样构建,如下所示:
My DB - Neo4j diagram
我的问题是找到左右节点。
通过这个虚拟查询,我得到了重复的结果
MATCH p=((nl)<-[:PREV*0..8]-(i)-[:NEXT*0..8]->(nr)) RETURN nodes(p);
这个returns重复的结果太多了。这里有一些结果示例:
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 returns 左右节点的所有可能组合都在 8 的限制内。
附加信息:
- 可以有多个"middle nodes"(示例中的'i')
- 我想要左边 8 个节点,右边 8 个或更少,但两边的节点数总是最大
是否可以使用 Cypher 执行此操作?
如果只需要一个,则按路径长度排序,并限制为单个结果:
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;
我尝试在我的项目中使用 Neo4J 图形数据库,我将尝试向您解释我的问题。
我想要最长的路径,在 8 个节点的限制内,在每个结果的左右两侧。但是我不知道图表每一端的最后一个节点
下图是一个基本示例。我的图表像链条一样构建,如下所示:
My DB - Neo4j diagram
我的问题是找到左右节点。 通过这个虚拟查询,我得到了重复的结果
MATCH p=((nl)<-[:PREV*0..8]-(i)-[:NEXT*0..8]->(nr)) RETURN nodes(p);
这个returns重复的结果太多了。这里有一些结果示例:
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 returns 左右节点的所有可能组合都在 8 的限制内。
附加信息:
- 可以有多个"middle nodes"(示例中的'i')
- 我想要左边 8 个节点,右边 8 个或更少,但两边的节点数总是最大
是否可以使用 Cypher 执行此操作?
如果只需要一个,则按路径长度排序,并限制为单个结果:
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;