Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Neo4j-Cypher:列出边_Neo4j_Cypher - Fatal编程技术网

Neo4j-Cypher:列出边

Neo4j-Cypher:列出边,neo4j,cypher,Neo4j,Cypher,例如,具有以下数据: 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)-[:KNOW

例如,具有以下数据:

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 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个节点并查找至少与所有3个节点有一个连接的人员:

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

我建议您增加图表并尝试/调整您的用例检查性能的最佳方法是
分析您的查询

对吗

我不知道为什么要进行联合,您可以轻松使用路径检查:

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个节点并查找至少与所有3个节点有一个连接的人员:

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
我建议增加您的图表并尝试/调整您的用例