繁体   English   中英

Neo4j Cypher:列出边缘

[英]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

我的问题是:

  • 这是正确的吗 ?
  • 这是最好的方法吗? 我的意思是说当有数千个节点时的性能。
  • 如果我要3个人共用节点该怎么办?

检查性能,最好的办法是到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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM