2016-05-10 68 views
2

我要生成CSV文件中的圖表。行是頂點,列是屬性。我要生成通過對頂點的相似的方式邊緣(不一定與權重),當兩個頂點具有一些屬性的值相同,這兩個之間的邊緣將具有值1或真相同的屬性。智能的方式來產生的Neo4j邊緣的大圖

發生到我

最簡單的暗號查詢看起來有點像這樣:

Match (a:LABEL), (b:LABEL) 
WHERE a.attr = b.attr 
CREATE (a)-[r:SIMILAR {attr : 1}]->(b) 

有圖有大約148000個頂點和Java Heap Size選項是:動態基礎計算的可用系統資源。

我發佈的查詢提供了一個Neo.DatabaseError.General.UnknownFailure有提示上面的Java堆空間。

一個問題,我能想到的,是一個巨大的笛卡爾乘積是建立第一個再尋找比賽創造的邊緣。有沒有更聰明,也許是連續的方式來做到這一點?

回答

2

我想你需要一點點變化模型:無需要通過特定屬性的值將每個節點彼此連接起來。最好有一箇中間節點,您將綁定具有相同值屬性的節點。

這可以在出口時或之後完成。

例如:

Match (A:LABEL) Where A.attr Is Not Null 
Merge (S:Similar {propName: 'attr', propValue: A.attr}) 
Merge (A)-[r:Similar]->(S) 

與單獨的查詢以後可以除去類似節點僅具有一個連接(具有這種屬性的相等的值沒有其他節點):

Match (S:Similar)<-[r]-() 
With S, count(r) As r Where r=1 
Detach Delete S 

如果需要通過所有道具連接,您可以使用下一個查詢:

Match (A:LABEL) Where A.attr Is Not Null 
With A, Keys(A) As keys 
    Unwind keys as key 
    Merge (S:Similar {propName: key, propValue: A[key]}) 
    Merge (A)-[:Similar]->(S) 
+0

完美,非常感謝!我要建立一個雙向圖。這會讓事情變得更容易。 – Wipster

+1

@時髦感謝您的有趣問題:) –

1

你說的沒錯,一個huuuge笛卡爾乘積會產生。

可以遍歷在例如1000批次的一個節點,並通過在每次迭代遞增SKIP值運行查詢,直到它返回0。

MATCH (a:Label) 
WITH a LIMIT SKIP 0 LIMIT 1000 
MATCH (b:Label) 
WHERE b.attr = a.attr AND id(b) > id(a) 
CREATE (a)-[:SIMILAR_TO {attr: 1}]->(b) 
RETURN count(*) as c