2015-11-01 38 views
1

我想爲下面的數據結構編寫一個緊湊查詢。Neo4j - 提取路徑中節點的屬性數據和指向這些節點的關係

節點N1到節點1000經由關係「REL1」 每個節點連接的n具有這樣的特性n.name 另一個節點(只有一個存在)Q具有關係「REL2」到每個節點n1與關係屬性q.value

(n1)-[rel1]->(n2)-[rel1]->(n3)--[rel1]-......->(n1000) 
(Q)-[rel2]->(n1), (Q)-[rel2]->(n2),(Q)-[rel2]->(n3)....... (Q)-[rel2]->(n1000) 

我想提取此數據:1000名(n.name)的出現的順序列表以及1000個q.values指向每個節點n

的列表

只要使用集合函數檢索所有名稱節點n就可以得到

match p=(n)-[r:rel1*..]->(m) where n.nodeNumber = 1 and m.nodeNumber=1000 RETURN extract(n IN nodes(p)| n.name) AS name 
ORDER BY length(p) DESC 
LIMIT 1 

我可以輕鬆提取指向這些節點的所有q.values嗎?理想情況下在一個聲明。

回答

1

只是爲了糾正以往優雅的命令。 a)丟失,您需要指定要搜索的路徑的長度。默認情況下它只有15個左右。我在命令中添加了1100個,因爲有1000個節點。我也將n更改爲nlist,因爲Neo4j抱怨n被宣佈兩次。

更新的命令是在這裏:

match p=shortestPath((n:Label)-[r:rel1*..1500]->(m:Label)) 
where n.nodeNumber = 1 and m.nodeNumber=1000 
UNWIND nodes(p) as nlist 
MATCH (nlist)<-[:rel2]-(q:Q) 
RETURN nlist.name, q.value; 
1

確保使用標籤+索引快速查找您的開始和結束節點。 如果使用最短路徑,它只會找到一條路徑。

match p=shortestPath((n:Label)-[r:rel1*..]->(m:Label) 
where n.nodeNumber = 1 and m.nodeNumber=1000 
RETURN extract(n IN nodes(p) | {name: n.name, value: head([p in (n)<-[:rel2]-() | last(nodes(p)).value])) AS data 
ORDER BY length(p) DESC 
LIMIT 1 

更優雅:

match p=shortestPath((n:Label)-[r:rel1*..]->(m:Label) 
where n.nodeNumber = 1 and m.nodeNumber=1000 
UNWIND nodes(p) as n 
MATCH (n)<-[:rel2]-(q:Q) 
RETURN n.name, q.value; 
+0

完美的,我用的標籤,但不想過於複雜的例子。 unwind命令是我缺失的鏈接。剛剛添加了兩條評論(查看其他答案) –