2017-02-16 100 views
0

我是Neo4j的新手,並且遇到了需要獲取數據的問題。我正在研究社交網絡的可視化項目。我想根據根節點的ID獲取所有的連接和關係(CONNECTED_TO),然後我可以遍歷數據並構建D3的數據結構。Cypher,獲取給定標籤的所有節點和關係,但不存在重複,空關係或空節點

Current Schema Image

我已經嘗試了很多瀏覽器查詢玩耍。當前在瀏覽器中返回正確的結果並自動完成,但在NodeJS中返回的結果返回重複項和空關係。

MATCH p=(a:Connection)-[r:CONNECTED_TO]-(b:Connection)-[r2:CONNECTED_TO]-() 
WHERE id(a) = 1673 
RETURN [a, b] as nodes [r, r2] 

下面的語句返回我想要它只是沒有WHERE子句。當添加的where子句只所以​​表現也和問題承擔返回根連接和他們的直接連接,無需對所有的關係

MATCH (a:Connection)-[r:CONNECTED_TO]-(b:Connection) 
RETURN [a, b] AS nodes, r AS relationship 

介質側的約200連接和2200間的關係數據集心神。

任何幫助將非常感謝。

UPDATE

通過InverseFalcon建議的APOC路徑膨脹過程工作良好。與使用可變長度關係相比,它非常高效。

這裏的結果查詢

MATCH (head:Connection) 
WHERE id(head) = 1673 
CALL apoc.path.expandConfig(head, {relationshipFilter:'CONNECTED_TO', uniqueness:'NODE_GLOBAL', bfs: true}) YIELD path 
WITH LAST(NODES(path)) as a 
MATCH (a)-[r:CONNECTED_TO]->(b) 
RETURN [a, b] as nodes, r as relationship 

回答

0

這聽起來像你想找到一個用戶的整個網絡,然後從網絡中的節點,輸出由連接的節點的每個配對:CONNECTED_TO關係。

當與variable-length relationships一起使用MATCH時,將探索所有路徑,這將導致建立冗餘關係,並可能在足夠大的網絡上爆炸。

APOC程序有一個有效的方法來擴展子圖的所有節點,其path expansion procedure。一旦我們在網絡中有了所有的連接節點,我們就可以在它們所連接的節點上進行匹配,並將這兩個節點與連接關係一起輸出。

另外,根據您對空關係的描述,如果這些關係中的任何一個具有屬性,則聽起來很少。沒有屬性的關係的文本輸出是空映射{},但在代碼本身中,應該有可用的關係id和類型數據。

如果確實要顯式返回關係的類型及其屬性,則可以使用map projection來包含關係的類型以及其它屬性。

完整的查詢可能是這樣的:

MATCH (head:Connection) 
WHERE id(head) = 1673 
CALL apoc.path.expandConfig(head, {relationshipFilter:'CONNECTED_TO>', uniqueness:'NODE_GLOBAL'}) YIELD path 
WITH LAST(NODES(path)) as a 
MATCH (a)-[r:CONNECTED_TO]->(b) 
RETURN [a, b] as nodes, r {TYPE(r), .*} as relationship 
+0

出色答卷InverseFalcon,非常好放在一起。感謝您指點我正確的方向。一些APOC程序將與我爲這個項目計劃的其他功能很好地協同工作。 –