如何标记所有源节点的所有后代?
How to mark all descendants of all source nodes?
在有向图中,您有源节点,入度 = 0。我想执行此过程:
- 选择一个源节点
- 对于它的每个后代,标记它是源节点的后代,以及到它的跳数。也许使用广度优先搜索
- 重复 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 调用,它会设置正确的属性。
在有向图中,您有源节点,入度 = 0。我想执行此过程:
- 选择一个源节点
- 对于它的每个后代,标记它是源节点的后代,以及到它的跳数。也许使用广度优先搜索
- 重复 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 调用,它会设置正确的属性。