2014-10-20 44 views
0

使用Neo4j 2.1.4。我有一個節點之間有'IS A'關係(和其他類型的關係)的圖。我在圖中有一些層次結構(IS A關係),我需要知道與第二層次的某些後裔具有特定已知關係的一個層次結構的後代(IS關係)。如果這種特定的已知關係存在,我將返回第一層次的後代。Neo4j - 緩慢密碼查詢 - 層次結構大圖

INPUTS:'ID_parentnode_hierarchy_01','ID_relationship','ID_parentnode_hierarchy_02'。
輸出:具有'ID_relationship'的'ID_parentnode_hierarchy_01'的後代(IS關係)與'ID_parentnode_hierarchy_02'的某些後代。

注意:該圖有500.000個節點和200萬個關係。

我正在使用這個密碼查詢,但它非常慢(在4GB RAM和3GHz奔騰雙核64位PC中約40秒)。有可能建立一個更快的查詢?

MATCH (parentnode_hierarchy_01: Node{nodeid : {ID_parentnode_hierarchy_01}}) 
WITH parentnode_hierarchy_01 
MATCH (parentnode_hierarchy_01) <- [:REL* {reltype: {isA}}] - (descendants01: Node) 
WITH descendants01 
MATCH (descendants01) - [:REL {reltype: {ID_relationship}}] -> (descendants02: Node) 
WITH descendants02, descendants01 
MATCH (parentnode_hierarchy_02: Node {nodeid: {ID_parentnode_hierarchy_02} }) 
<- [:REL* {reltype: {isA}}] - (descendants02) 
RETURN DISTINCT descendants01; 

非常感謝。

+0

如果可能,請勿使用通用關係類型和rel-properties。這會減慢你的查詢速度。 – 2014-10-20 15:17:31

+0

我從一個CSV文件生成我的圖表閱讀與'負載CSV的標題從...'和'...創建(c1) - [:REL {reltype:rel.relid,reldesc:rel.desc}] - > (C2)」。我不知道如何建立'rel.relid'(來自CSV文件)作爲關係的類型。這就是爲什麼我使用通用的'REL'關係。謝謝。 – Vicente 2014-10-21 09:52:57

回答

1

嗯,我可以稍微清理你的查詢 - 這可能會幫助我們更好地理解問題。我懷疑這人會跑得更快,但是使用清理版本中,我們可以討論這是怎麼回事:(主要是消除MATCH/WITH不需要使用)

MATCH (parent:Node {nodeid: {ID_parentnode_hierarchy_01}})<-[:REL* {reltype:{isA}}]- 
     (descendants01:Node)-[:REL {reltype:{ID_relationship}}]->(descendants02:Node), 

     (parent2:Node {nodeid: {ID_parentnode_hierarchy_02}})<-[:REL* {reltype:{isA}}]- 
     (descendants02) 
RETURN distinct descendants01; 

這就像你正在尋找兩(可能大)樹,從根開始,樹中某處的兩個節點由{ID_relationship}鏈接。

除非你可以提供一些關於樹中哪個節點可能有ID_relationship或類似的東西的查詢提示,最壞的情況是,這看起來好像你最終可以比較兩棵樹中的每兩個節點。所以這看起來可能需要n * k時間,其中n是第一棵樹中節點的數量,k是第二棵樹中節點的數量。

這裏有一些策略事情要考慮 - 你應該使用它取決於你的數據:

  1. 有沒有在樹枝上,這些鏈接可能一些深度被發現?你可以在[:REL* {reltype:{isA}}]的深度上放一個範圍嗎?
  2. 您還可以將其他標準添加到descendants01descendants02?有沒有什麼能夠幫助提高查詢的選擇性,以便不將一棵樹中的每個節點與另一棵樹中的每個節點進行比較?

你可以嘗試另一種策略是這樣的:(這可能是一個可怕的想法,但它是值得一試) - 基本上是尋找一個路徑從一個根部到另一個,在任意數量或者isa的無向邊的類型,或其他。您的數據模型與reltype屬性具有:REL關係。這可能是反模式;而不是reltype屬性,爲什麼關係類型不僅僅是這樣?這可以防止我寫,下面的查詢:

MATCH p=shortestPath((p1:Node {nodeid: {first_parent_id}})-[:isA|ID_relationship*]-(p2:Node {nodeid: {second_parent_id}})) 
return p; 

這從一個「根」到另一個返回路徑,通過你想要的橋樑。然後你可以使用路徑函數來提取你想要的任何節點。請注意,由於您的數據模型,此查詢目前不可能。