属于列表Neo4j cypher的返回关系

属于列表Neo4j cypher的返回关系,neo4j,cypher,Neo4j,Cypher,我的数据集包含3百万个节点和超过5百万个关系。大约有8种不同的关系类型。现在我想返回两个相互连接的节点。。这里的两个节点是A和B,我想看看它们是否相互连接 MATCH (n:WCD_Ent) USING INDEX n:WCD_Ent(WCD_NAME) WHERE n.WCD_NAME = "A" MATCH (m:WCD_Ent) USING INDEX m:WCD_Ent(WCD_NAME) WHERE m.WCD_NAME = "B" MATCH (n) - [r*] - (m) RET

我的数据集包含3百万个节点和超过5百万个关系。大约有8种不同的关系类型。现在我想返回两个相互连接的节点。。这里的两个节点是A和B,我想看看它们是否相互连接

MATCH (n:WCD_Ent)
USING INDEX n:WCD_Ent(WCD_NAME)
WHERE n.WCD_NAME = "A"
MATCH (m:WCD_Ent)
USING INDEX m:WCD_Ent(WCD_NAME)
WHERE m.WCD_NAME = "B"
MATCH (n) - [r*] - (m)
RETURN n,r,m
这给了我Java堆空间错误

我希望在查询中加入的另一个条件是,两个节点A和B之间的关系是否至少包含一种特定的关系类型(名称匹配)。A您能帮我解决同样的问题吗?

一些增强功能:

  • 您可以在模式内绑定属性值,而不是
    WHERE
    条件
  • 您可以将三个
    MATCH
    条件组合成一个条件,以确保查询引擎不会计算
    n
    m
    的笛卡尔积。(您也可以使用
    EXPLAIN
    可视化查询计划并进行检查。)
  • 生成的查询:

    MATCH (n:WCD_Ent { WCD_NAME: "A" })-[r*]-(m:WCD_Ent { WCD_NAME: "B" })
    RETURN n, r, m
    
    更新:Tore Eschliman指出您不需要指定索引,因此我从查询中删除了以下两行:

    一些增强功能:

  • 您可以在模式内绑定属性值,而不是
    WHERE
    条件
  • 您可以将三个
    MATCH
    条件组合成一个条件,以确保查询引擎不会计算
    n
    m
    的笛卡尔积。(您也可以使用
    EXPLAIN
    可视化查询计划并进行检查。)
  • 生成的查询:

    MATCH (n:WCD_Ent { WCD_NAME: "A" })-[r*]-(m:WCD_Ent { WCD_NAME: "B" })
    RETURN n, r, m
    
    更新:Tore Eschliman指出您不需要指定索引,因此我从查询中删除了以下两行:


    加博的建议是最重要的修正;您正在扩大堆空间,因为您正在生成要开始的行的笛卡尔积,然后使用该模式进行过滤。使用该模式生成行,您将更加节省空间。如果您在
    WCD\u Ent(WCD\u NAME)
    上有索引,则也不需要指定索引;只有当查询运行非常慢并且
    概要文件显示查询计划器正在跳过索引时,才能执行此操作。试试这个:

    MATCH (n:WCD_Ent { WCD_NAME: "A" })-[r*..5]-(m:WCD_Ent { WCD_NAME: "B" })
    WHERE ANY(rel IN r WHERE TYPE(rel) = 'NAME_MATCH')
    RETURN n, r, m
    

    此处的
    WHERE
    过滤器将检查
    r
    中的所有关系(这是一个集合,您分配它的方式),并确保其中至少有一个与所需类型匹配

    Gabor的建议是最重要的修正;您正在扩大堆空间,因为您正在生成要开始的行的笛卡尔积,然后使用该模式进行过滤。使用该模式生成行,您将更加节省空间。如果您在
    WCD\u Ent(WCD\u NAME)
    上有索引,则也不需要指定索引;只有当查询运行非常慢并且
    概要文件显示查询计划器正在跳过索引时,才能执行此操作。试试这个:

    MATCH (n:WCD_Ent { WCD_NAME: "A" })-[r*..5]-(m:WCD_Ent { WCD_NAME: "B" })
    WHERE ANY(rel IN r WHERE TYPE(rel) = 'NAME_MATCH')
    RETURN n, r, m
    
    此处的
    WHERE
    过滤器将检查
    r
    中的所有关系(这是一个集合,您分配它的方式),并确保其中至少有一个与所需类型匹配

    Tore的答案(包括变量关系上限)是确定两个节点是否连接以及连接它们的路径中是否存在某种关系的最佳答案

    到目前为止给出的大多数解决方案的一个缺点是对变量关系匹配没有限制,这意味着查询将对整个图进行爬网,试图在所有可能的路径上进行匹配,而不是只检查一个这样的路径是否存在,然后停止。这可能是堆空间错误的原因

    Tore建议在匹配中的可变长度关系上添加一个上限,这是一个很好的解决方案,因为在两个节点未连接的情况下,它也有助于解决问题,从而避免了对整个图形进行爬网。在所有情况下,上限都应该防止堆爆炸

    这里还有一些可能性。我省略了关系的上限,但如果需要,可以很容易地添加

    // this one won't check for the particular relationship type in the path
    // but doesn't need to match on all possible paths, just find connectedness
    MATCH (n:WCD_Ent { WCD_NAME: "A" }), (m:WCD_Ent { WCD_NAME: "B" })
    RETURN EXISTS((n)-[*]-(m))
    
    // using shortestPath() will only give you a single path back that works
    // however WHERE ANY may be a filter to apply after matches are found
    // so this may still blow up, not sure
    MATCH (n:WCD_Ent { WCD_NAME: "A" }), (m:WCD_Ent { WCD_NAME: "B" })
    RETURN shortestPath((n)-[r*]-(m))
    WHERE ANY(rel IN r WHERE TYPE(rel) = 'NAME_MATCH')
    
    // Adding LIMIT 1 will only return one path result
    // Unsure if this will prevent the heap from blowing up though
    // The performance and outcome may be identical to the above query
    MATCH (n:WCD_Ent { WCD_NAME: "A" }), (m:WCD_Ent { WCD_NAME: "B" })
    MATCH (n)-[r*]-(m)
    WHERE ANY(rel IN r WHERE TYPE(rel) = 'NAME_MATCH')
    RETURN n, r, m
    LIMIT 1
    
    Tore的答案(包括变量关系上限)是确定两个节点是否连接以及连接它们的路径中是否存在某种关系的最佳答案

    到目前为止给出的大多数解决方案的一个缺点是对变量关系匹配没有限制,这意味着查询将对整个图进行爬网,试图在所有可能的路径上进行匹配,而不是只检查一个这样的路径是否存在,然后停止。这可能是堆空间错误的原因

    Tore建议在匹配中的可变长度关系上添加一个上限,这是一个很好的解决方案,因为在两个节点未连接的情况下,它也有助于解决问题,从而避免了对整个图形进行爬网。在所有情况下,上限都应该防止堆爆炸

    这里还有一些可能性。我省略了关系的上限,但如果需要,可以很容易地添加

    // this one won't check for the particular relationship type in the path
    // but doesn't need to match on all possible paths, just find connectedness
    MATCH (n:WCD_Ent { WCD_NAME: "A" }), (m:WCD_Ent { WCD_NAME: "B" })
    RETURN EXISTS((n)-[*]-(m))
    
    // using shortestPath() will only give you a single path back that works
    // however WHERE ANY may be a filter to apply after matches are found
    // so this may still blow up, not sure
    MATCH (n:WCD_Ent { WCD_NAME: "A" }), (m:WCD_Ent { WCD_NAME: "B" })
    RETURN shortestPath((n)-[r*]-(m))
    WHERE ANY(rel IN r WHERE TYPE(rel) = 'NAME_MATCH')
    
    // Adding LIMIT 1 will only return one path result
    // Unsure if this will prevent the heap from blowing up though
    // The performance and outcome may be identical to the above query
    MATCH (n:WCD_Ent { WCD_NAME: "A" }), (m:WCD_Ent { WCD_NAME: "B" })
    MATCH (n)-[r*]-(m)
    WHERE ANY(rel IN r WHERE TYPE(rel) = 'NAME_MATCH')
    RETURN n, r, m
    LIMIT 1
    

    你好,我得到这个错误。你能帮我做同样的事吗?类型不匹配:预期关系,但为集合(第2行,第31列(偏移量:140))“WHERE ANY(r中的rel,其中类型(r)=‘NAME_MATCH’”),并且它指向“Type(r)”中的“r”应该是
    rel
    ,而不是
    Type
    调用中的
    r
    。(上面已修复)我今天无法正确键入任何内容,抱歉:)不用担心,但在运行上述查询时,我仍然会遇到Java堆空间错误:(那么,请尝试上界。
    [r*.5]
    。从理论上讲,您当前的查询可能会触及整个图形,如果不想让它爆炸,您必须以某种方式对其进行限制。另外需要注意的是,您与r*的匹配将搜索所有路径,而不考虑方向和关系类型,基本上会对整个图形进行爬网,以查找所有可能的匹配,可能是