[英]Neo4j Cypher : listing edges
例如具有此数据:
CREATE
(p1:Person {name:"p1"}),
(p2:Person {name:"p2"}),
(p3:Person {name:"p3"}),
(p4:Person {name:"p4"}),
(p5:Person {name:"p5"}),
(p1)-[:KNOWS]->(p2),
(p1)-[:KNOWS]->(p3),
(p1)-[:KNOWS]->(p4),
(p5)-[:KNOWS]->(p3),
(p5)-[:KNOWS]->(p4)
我想得到p1和p5之间的共同关系:
MATCH (p1:Person {name:"p1"})-[r1:KNOWS]-(p:Person)-[r2:KNOWS]-(p5:Person {name:"p5"})
RETURN p, p1, p5
这将返回4个节点:p1,p3,p4,p5和4个边。
我的目标是使边缘的方向像表行:从和到。 所以这似乎可行:
MATCH (p1:Person {name:"p1"})-[r1:KNOWS]-(p:Person)-[r2:KNOWS]-(p5:Person {name:"p5"})
RETURN startNode(r1).name AS from, endNode(r1).name AS to
UNION
MATCH (p1:Person {name:"p1"})-[r1:KNOWS]-(p:Person)-[r2:KNOWS]-(p5:Person {name:"p5"})
RETURN startNode(r2).name AS from, endNode(r2).name AS to
结果是一个表:
from | to
-----|----
p1 | p3
p1 | p4
p5 | p3
p5 | p4
我的问题是:
检查性能,最好的办法是到PROFILE
查询。
这是正确的吗 ?
我不确定为什么要执行UNION,可以轻松使用路径检查:
PROFILE MATCH (p1:Person {name:"p1"}), (p5:Person {name:"p5"})
MATCH path=(p1)-[*..2]-(p5)
UNWIND rels(path) AS r
RETURN startNode(r).name AS from, endNode(r).name AS to
这是最好的方法吗? 我的意思是说当有数千个节点时的性能。
通常,您将通过单次查找首先匹配所需路径的起点和终点(确保对Person节点的标签/属性对具有索引/约束)。 根据您的图形程度,这可能是一项广泛的操作,例如,可以通过限制路径的最大深度*..15
进行微调。
如果我要3个人共用节点该怎么办?
有多种方法取决于图形的大小:
a)如果节点不太多:
匹配3个节点,找到与ALL 3至少有一个连接的Person:
PROFILE MATCH (p:Person) WHERE p.name IN ["p1","p4","p3"]
WITH collect(p) AS persons
MATCH (p:Person) WHERE ALL(x IN persons WHERE EXISTS((x)--(p)))
RETURN p
b)进行一些调整,假设一个公共点将直接连接到3中的第一个节点
PROFILE MATCH (p:Person) WHERE p.name IN ["p1","p4","p3"]
WITH collect(p) AS persons
WITH persons, persons[0] as p
MATCH (p)-[:KNOWS]-(other)
WHERE ALL (x IN persons WHERE EXISTS((x)--(other)))
RETURN other
c)如果您需要多深度路径中的公共空间:
PROFILE MATCH (p:Person) WHERE p.name IN ["p1","p4","p3"]
WITH collect(p) AS persons
WITH persons, persons[0] as p1, persons[1] as p2
MATCH path=(p1)-[*..15]-(p2)
WHERE ANY(x IN nodes(path) WHERE x = persons[2])
UNWIND rels(path) AS commonRel
WITH distinct commonRel AS r
RETURN startNode(r) AS from, endNode(r) AS to
我建议您增加图表并尝试/调整用例
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.