0

我有一个具有NEXT关系的节点图,具有 2 个属性序列(s)和位置(p)。例如:

N1-[NEXT{s:1, p:2}]-> N2-[NEXT{s:1, p:3}]-> N3-[NEXT{s:1, p:4}]-> N4 

一个节点 N 可能有多个具有不同属性值的传出Next关系。

给定节点名称列表,例如 [N2,N3,N4] 表示顺序路径,我想检查图形是否包含节点以及节点是否按顺序与关系Next连接。

例如,如果列表包含 [N2,N3,N4],则检查节点 N2,N3 和 N3,N4 之间是否存在关系Next 。

另外,我想确保节点是同一序列的一部分,因此属性s对于每个关系Next都是相同的。为了确保订单保持不变,我需要验证属性p是否是增量的。也就是说,N2 -> N3 之间的关系中p的值为3,N3->N4 之间的 p 值为 (3+1) = 4 以此类推。

我尝试使用 APOC 使用 python(库:neo4jrestclient)从初始节点 N 检索可能的路径,然后使用以下查询手动处理路径以检查序列是否存在:

q = "MATCH (n:Node) WHERE n.name = 'N' CALL apoc.path.expandConfig(n {relationshipFilter:'NEXT>', maxLevel:4}) YIELD path RETURN path"

结果 = db.query(q,data_contents=True)

但是,运行查询需要一些时间,我最终停止了查询。有任何想法吗?

4

1 回答 1

0

这个有点难。

首先,预匹配路径中的节点。我们可以将这里收集到的节点作为路径中节点的白名单

假设起始节点包含在列表中,查询可能如下所示:

UNWIND $names as name
MATCH (n:Node {name:name})
WITH collect(n) as nodes
WITH nodes, nodes[0] as start, tail(nodes) as tail, size(nodes)-1 as depth
CALL apoc.path.expandConfig(start, {whitelistNodes:nodes, minLevel:depth, maxLevel:depth, relationshipFilter:'NEXT>'}) YIELD path
WHERE all(index in range(0, size(nodes)-1) WHERE nodes[index] = nodes(path)[index])
// we now have only paths with the given nodes in order
WITH path, relationships(path)[0].s as sequence
WHERE all(rel in tail(relationships(path)) WHERE rel.s = sequence)
// now each path only has relationships of common sequence
WITH path, apoc.coll.pairsMin([rel in relationships(path) | rel.p]) as pairs
WHERE all(pair in pairs WHERE pair[0] + 1 = pair[1])
RETURN path
于 2019-10-14T23:32:46.677 回答