如何标记所有源节点的所有后代?

How to mark all descendants of all source nodes?

在有向图中,您有源节点,入度 = 0。我想执行此过程:

  1. 选择一个源节点
  2. 对于它的每个后代,标记它是源节点的后代,以及到它的跳数。也许使用广度优先搜索
  3. 重复 1 直到完成

我可以搜索所有源节点,使用:

CALL gds.graph.create( 'RELREV', 'note', {REL: {orientation: 'REVERSE'}});
CALL gds.degree.write('RELREV', { writeProperty: 'indegree' });
MATCH (n) WHERE n.indegree=0;

我可以标记一个源节点(比如节点 A)的所有后代,使用:

match p=(start {name: 'nodename'})-[:REL*..8]->(n) 
with n, collect(length(p)) as collect 
unwind collect as hoplist 
with n, collect, min(hoplist) as min 
set n.A=min return n.name, collect, n.A;

但是我找不到为所有源节点自动标记的方法。主要是因为我不知道如何设置列表 属性 名称,比如 属性 A 表示源节点 A,属性 B 表示源节点 B,等等。我想 Parameters 是开始的地方,但阅读它似乎没有帮助。

我会沿着这些路线(顺便说一句,未经测试)使用 apoc 并假设您有一组 'source' 个节点。

// get paths in an efficient way, so up to a 'leaf'
MATCH p=(source)-[:REL*]->(n)
WHERE NOT EXISTS((n)-[:REL]->())

// create a set of rows for each path. number of rows equals length of path
UNWIND RANGE(1,LENGTH(p)) AS i
WITH source,i,nodes(p)[i] AS descendant 

// use apoc magic  
CALL apoc.create.setProperty(descendant,source.name,i) YIELD node

// check the results
RETURN source.name, properties(node)

补充说明

  • WHERE NOT EXISTS((n)-[:REL]->()) 是您不需要调查的排除路径。例如如果你有 (source)-[REL]->(d1)-[REL]->(d2) ,你不需要调查 (source)-[REL]->(d1)

  • 如果您有如下图所示的图表

这部分查询

MATCH (source) WHERE source.name CONTAINS 'Ooker'
MATCH p=(source)-[:REL*]->(n)
WHERE NOT EXISTS((n)-[:REL]->())
UNWIND RANGE(1,LENGTH(p)) AS i
WITH source,i,nodes(p)[i] AS descendant 
RETURN source.name, i, descendant.name

returns这个:

╒═════════════╤═══╤═════════════════╕
│"source.name"│"i"│"descendant.name"│
╞═════════════╪═══╪═════════════════╡
│"Ooker2"     │1  │"D"              │
├─────────────┼───┼─────────────────┤
│"Ooker2"     │2  │"E"              │
├─────────────┼───┼─────────────────┤
│"Ooker2"     │3  │"B"              │
├─────────────┼───┼─────────────────┤
│"Ooker2"     │4  │"C"              │
├─────────────┼───┼─────────────────┤
│"Ooker"      │1  │"A"              │
├─────────────┼───┼─────────────────┤
│"Ooker"      │2  │"B"              │
├─────────────┼───┼─────────────────┤
│"Ooker"      │3  │"C"              │
└─────────────┴───┴─────────────────┘

如果您将源、i 和后代提供给 apoc 调用,它会设置正确的属性。