获取 Neo4J 中每个节点的叶子

Get the leaves of every node in Node4J

因此,以存储在 csv 文件中的数据为例:

source,child
A,B
B,C
C,D
X,Y
Y,Z

我这样加载它:

LOAD CSV WITH HEADERS FROM 'file:///data.csv' AS line 
MERGE (s:src {id: line.source}) 
MERGE (d:dst {id: line.child}) 
CREATE (s)-[:FEEDs_INTO]->(d)

在我的示例中,我们有 2 个叶子 - A 和 X,但一个节点可能有多个叶子。现在我想获得每个叶节点连接。所以对于我的例子,我想要这样的东西:

A,B
A,C
A,D
X,Y
X,Z

我该怎么做?

您的数据模型可以进一步改进。由于 src 和 dst 是连接的,因此您可以将它们标记为一个 class (假设将其标记为“节点”)。因此你的加载脚本可以如下:

LOAD CSV WITH HEADERS FROM 'file:///data.csv' AS line 
MERGE (s:node {id: line.source})
MERGE (d:node {id: line.child}) 
MERGE (s)-[:FEEDs_INTO]->(d)

那么您的查询就很简单了:

MATCH (child:node)-[:FEEDs_INTO*]->(parent:node)
WHERE NOT EXISTS((:node)-->(child)) 
RETURN child, parent 

其中关系中的 * 表示路径可能从 1 到最大长度 x 不等。这就像你想从 A 跳到 B(长度:1)到 C(长度:2)然后到 D(长度:3)等等。 where 子句确保 child 是没有附加节点的叶子。

 Result:
╒══════════╤══════════╕
│"child"   │"parent"  │
╞══════════╪══════════╡
│{"id":"A"}│{"id":"B"}│
├──────────┼──────────┤
│{"id":"A"}│{"id":"C"}│
├──────────┼──────────┤
│{"id":"A"}│{"id":"D"}│
├──────────┼──────────┤
│{"id":"X"}│{"id":"Y"}│
├──────────┼──────────┤
│{"id":"X"}│{"id":"Z"}│
└──────────┴──────────┘