(parent:LevelTwo) RETURN-6ren">
gpt4 book ai didi

neo4j - 当子节点有多个父节点时,如何使用 Neo4J/Cypher 避免大量冗余路径分析?

转载 作者:行者123 更新时间:2023-12-04 23:53:04 25 4
gpt4 key购买 nike

这将返回与“id1”整整两代的所有唯一父代。

MATCH (:LevelOne {id: "id1"})-[:ISCHILDOF*2..2]->(parent:LevelTwo)
RETURN DISTINCT parent ORDER BY parent.id

当每个 child 只有一个 parent 时,这很好用。但在我的数据中,一个节点可以有多个父节点(没有循环关系)。根据

PROFILE MATCH (:LevelOne {id: "id1"})-[:ISCHILDOF*2..2]->(parent:LevelTwo)
RETURN DISTINCT parent ORDER BY parent.id

只有几千个节点,这会导致数千万个路径组合,并且由于资源耗尽而导致持续失败。

例如,给定这个

relations

其中“id1”是节点 A,并且您希望它的所有父节点远离三代,您可以为每个子节点“通过”D 节点两次:ABDF、ACDF。

避免这种冗余的一种方法是一次查询一代,例如从:

MATCH (:LevelOne {id: "id1"})-[:ISCHILDOF]->(parent:LevelTwo)
RETURN DISTINCT parent ORDER BY parent.id

(“*2..2”范围消失了)

收集返回的 parent ,遍历他们收集他们的id,并用他们查询下一代 parent :

MATCH (:LevelOne {id: "id1"})-[:ISCHILDOF]->(parent:LevelTwo)
WHERE child.id IN [
'id1001',
'id1002',
'id1003',
'id1004',
'id1005',
'id1006',
'id1013',
'id1014',
'id1015',
'id1016',
'id1017']
RETURN DISTINCT parent
ORDER BY parent.id

根据需要对任意多代级别重复此操作。

是否有更好、更标准的方法来实现这一目标?

最佳答案

[更新]

最老一代的祖先

如果您只需要搜索最老一代的祖先,这种方法应该适合您。很容易为任意数量的世代生成查询。

假设你想搜索距离 id 为 "id1"的节点 4 代的祖先:

MATCH (:LevelOne { id: "id1" })-[:ISCHILDOF]->(parent:LevelTwo)
WITH DISTINCT parent AS ancestor
MATCH (ancestor)-[:ISCHILDOF]->(parent:LevelTwo)
WITH DISTINCT parent AS ancestor
MATCH (ancestor)-[:ISCHILDOF]->(parent:LevelTwo)
WITH DISTINCT parent AS ancestor
MATCH (ancestor)-[:ISCHILDOF]->(parent:LevelTwo)
RETURN DISTINCT parent AS ancestor;

MATCH子句的数量对应于生成的数量。

This console展示了这种方法 5 代。

每一代的祖先(即使不在最老一代的路径上)

如果您希望搜索每一代的祖先,这种方法应该适合您。以下示例适用于 4 代。

注意:这种方法将列出每一代中的每个祖先,即使是那些不在最老一代路径上的祖先。

MATCH (:LevelOne { id: "id1" })-[:ISCHILDOF]->(parent:LevelTwo)
WITH COLLECT(DISTINCT parent) AS ancestors
WITH [ancestors] AS generations, ancestors UNWIND ancestors AS ancestor
MATCH (ancestor)-[:ISCHILDOF]->(parent:LevelTwo)
WITH generations, COLLECT(DISTINCT parent) AS ancestors
WITH generations+[ancestors] AS generations, ancestors UNWIND ancestors AS ancestor
MATCH (ancestor)-[:ISCHILDOF]->(parent:LevelTwo)
WITH generations, COLLECT(DISTINCT parent) AS ancestors
WITH generations+[ancestors] AS generations, ancestors UNWIND ancestors AS ancestor
MATCH (ancestor)-[:ISCHILDOF]->(parent:LevelTwo)
WITH generations, COLLECT(DISTINCT parent) AS ancestors
RETURN generations+[ancestors] AS generations;

关于neo4j - 当子节点有多个父节点时,如何使用 Neo4J/Cypher 避免大量冗余路径分析?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34773950/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com