2017-01-22 74 views
0

有了這個數據,例如:Neo4j的暗號:上市邊緣

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邊緣。

我的目標是獲得與表格行相同的邊緣:from和to。因此,這似乎工作:

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人?

回答

2

檢查性能的最佳方法是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人怎麼辦?

有根據您的圖形的大小多種方式:

一)如果有太多的節點不是:

比賽的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 

我會建議增加你的圖形,並嘗試/調整您的使用情況