【问题标题】:how to match right and left nodes with cypher and neo4j如何用cypher和neo4j匹配左右节点
【发布时间】:2018-07-16 17:58:15
【问题描述】:

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

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

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

My DB - Neo4j diagram

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

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 执行此操作?

【问题讨论】:

    标签: node.js graph neo4j graph-traversal neo4j-driver


    【解决方案1】:

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

    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;
    

    【讨论】:

    • 感谢 InverseFalcon。您的第一个查询适用于单个结果,但我需要多个结果,因为我经常有超过 1 个“i”节点。第二个查询为每行提供了很多节点,我不明白为什么。并且节点以一种奇怪的方式排序。
    • 然后尝试替代查询。
    • 抱歉,我的第一条评论发送得太早了。我编辑了它。
    • 我上面的查询中缺少的是i节点的绑定,所以现在每个节点都可以绑定到i。如果先匹配i 节点,然后使用相同的i 变量附加此查询的其余部分,是否仍然得到奇怪的结果?
    • 首先匹配 i 节点也是一样的。它每行返回 200 个节点和 50 行。但这是对的,我的数据库中有 50 个“i 节点”!抱歉,我是 neo4j 和图形数据库的菜鸟。我会坚持第二个查询
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多