2013-06-05 121 views
1

我有一個包含數百萬節點和關係的大圖。 我需要找出與< = 5個箍之間的所有可能的關係組。 示例: GroupA {Node1,Node2,Node3,... Node100}具有100個節點的節點組。查找節點組之間的所有可能關係

現在我想找到所有這些節點之間的所有可能的關係。

當我運行包含100個節點的Cypher Query時,一切正常,但是當我用101個節點運行它時,我得到了TimeOut。 (所有請求都是REST)

{ 
     "query": "start s = node(114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214), d = node(114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214) match p = s -[r?*0..5]-> d return p ", 
     "params": {} 
    } 

有人可以解釋我會發生什麼?錯誤查詢?

UPDATE: 另一個問題發現: 當我運行200個的Cypher查詢環路,服務器停止後查詢號碼100

Something like that 
for (i=0; i<200; i++) 
{ 
    query = "start s = node(" + sourceNodeId + "), d = node(" + destinationNodeid + ") match p = s -[r?*0.." + deep + "]-> d return p" 
    RunCypherQuery(query); 
} 

迴應可能會導致什麼爲這種奇怪的行爲? 10X

UPDATE:

我進行存儲的調整和增加JavaMemory MIN和MAX 4G的,而不是4M和64M 結果是例外:

Error 500 GC overhead limit exceeded 
HTTP ERROR 500 
Problem accessing /db/data/cypher. 
Reason: 
GC overhead limit exceeded</pre></p><h3>Caused by:</h3><pre>java.lang.OutOfMemoryError: GC overhead limit exceeded 
    at scala.collection.JavaConversions$.mapAsScalaMap(JavaConversions.scala:488) 
    at scala.collection.JavaConverters$$anonfun$mapAsScalaMapConverter$1.apply(JavaConverters.scala:441) 
    at scala.collection.JavaConverters$$anonfun$mapAsScalaMapConverter$1.apply(JavaConverters.scala:441) 
    at scala.collection.JavaConverters$AsScala.asScala(JavaConverters.scala:80) 
    at org.neo4j.cypher.internal.pipes.MutableMaps$.create(Pipe.scala:60) 
    at org.neo4j.cypher.internal.pipes.ExecutionContext.newWith(Pipe.scala:136) 
    at org.neo4j.cypher.internal.pipes.matching.AddedHistory.toMap(History.scala:75) 
    at org.neo4j.cypher.internal.pipes.matching.PatternMatcher.isMatchSoFar(PatternMatcher.scala:166) 
    at org.neo4j.cypher.internal.pipes.matching.PatternMatcher.org$neo4j$cypher$internal$pipes$matching$PatternMatcher$$traverseNextNodeFromRelationship(PatternMatcher.scala:98) 
    at org.neo4j.cypher.internal.pipes.matching.PatternMatcher$$anonfun$4.apply(PatternMatcher.scala:150) 
    at org.neo4j.cypher.internal.pipes.matching.PatternMatcher$$anonfun$4.apply(PatternMatcher.scala:150) 
    at scala.collection.immutable.Stream$$anonfun$map$1.apply(Stream.scala:175) 
    at scala.collection.immutable.Stream$$anonfun$map$1.apply(Stream.scala:175) 
    at scala.collection.immutable.Stream$Cons.tail(Stream.scala:634) 
    at scala.collection.immutable.Stream$Cons.tail(Stream.scala:626) 
    at scala.collection.immutable.Stream.foldLeft(Stream.scala:302) 
    at org.neo4j.cypher.internal.pipes.matching.PatternMatcher.traverseRelationship(PatternMatcher.scala:150) 
    at org.neo4j.cypher.internal.pipes.matching.PatternMatcher.traverseNextSpecificNode(PatternMatcher.scala:61) 
    at org.neo4j.cypher.internal.pipes.matching.PatternMatcher.traverseNode(PatternMatcher.scala:72) 
    at org.neo4j.cypher.internal.pipes.matching.PatternMatcher.traverseNextNodeOrYield(PatternMatcher.scala:177) 
    at org.neo4j.cypher.internal.pipes.matching.PatternMatcher.traverseNextSpecificNode(PatternMatcher.scala:60) 
    at org.neo4j.cypher.internal.pipes.matching.PatternMatcher.traverseNode(PatternMatcher.scala:72) 
    at org.neo4j.cypher.internal.pipes.matching.PatternMatcher.foreach(PatternMatcher.scala:36) 
    at scala.collection.TraversableLike$class.map(TraversableLike.scala:194) 
    at org.neo4j.cypher.internal.pipes.matching.PatternMatcher.map(PatternMatcher.scala:28) 
    at org.neo4j.cypher.internal.pipes.matching.PatterMatchingBuilder.org$neo4j$cypher$internal$pipes$matching$PatterMatchingBuilder$$createPatternMatcher(PatterMatchingBuilder.scala:90) 
    at org.neo4j.cypher.internal.pipes.matching.PatterMatchingBuilder$$anonfun$getMatches$1.apply(PatterMatchingBuilder.scala:47) 
    at org.neo4j.cypher.internal.pipes.matching.PatterMatchingBuilder$$anonfun$getMatches$1.apply(PatterMatchingBuilder.scala:47) 
    at scala.collection.TraversableLike$$anonfun$flatMap$1.apply(TraversableLike.scala:200) 
    at scala.collection.TraversableLike$$anonfun$flatMap$1.apply(TraversableLike.scala:200) 
    at org.neo4j.cypher.internal.pipes.matching.PatternMatcher.yieldThis(PatternMatcher.scala:185) 
    at org.neo4j.cypher.internal.pipes.matching.PatternMatcher.traverseNextNodeOrYield(PatternMatcher.scala:175) 
+1

我執行升級到1.9。然後我刪除了內存調整爲默認值。在我最後一次嘗試中,當A的大小爲100個節點和B 1000節點的大小時,我成功地在2組A和B之間執行查詢。該查詢運行約69042毫秒=> 1分鐘9秒。問題仍然存在:爲什麼我無法使用大於100個節點的源組執行查詢。 – Zaber

回答

1

我認爲你的問題可能有點不清楚。你想要返回所有連接對的列表?如果是的話,這裏有一個暗號查詢將返回所有對:

START a=node(*) 
MATCH p=a-[*1..5]->b 
RETURN distinct p 
+0

嗨尼古拉斯,我想找到特定的節點組內的所有對在我的情況下,我有巨大的數百萬節點的圖,但檢查組只包括其中的100個,但節點(*)它都是圖 – Zaber

-1

我同意尼古拉斯,你應該嘗試使用暗號,您可以通過REST API發送以及(見here)。

嘗試

START n=node(1,2,3), m=node(1,2,3) 
MATCH n-[?*..4]->()-[r]->m 
RETURN DISTINCT r; 

當然更換(1,2,3)與您長100個節點ID列表! 這就是你正在尋找的,如果我正確地承諾你!

+0

嗨A Sz,我檢查你查詢並運行正常,但直到我使用<100元素的組。同樣對我的查詢也是正確的。當我增加組大小隻有1 => 101而不是100時,你會像我一樣查詢死亡。我真的認爲這個服務器有這個問題的一些配置,但我不知道在哪裏搜索。 – Zaber

+0

是的,100是將數字舍入爲任意隨機存儲器或類似限制的方式。必須是一些配置。你在哪個版本的'neo4j'上? –

+0

我認爲這是最後穩定的Neo4j 1.8。2 – Zaber

相關問題