2017-06-13 116 views
0

我是Neo4j的新手,我正在使用示例提供的數據庫(Link)。 我試圖在每個演員之間創建一個新的relatiohip,我運行此查詢Neo4j Cypher沒有履行查詢

MATCH (p1:Actor)-[:ACTS_IN]->(:Movie)<-[:ACTS_IN]-(p2:Actor) WHERE id(p1)>id(p2) MERGE (p1)-[:ACTED_WITH]->(p2)

但由於未知原因,它創建只是一些關係,而不是其他。我檢查了兩個節點類型和關係類型,但似乎他們都是一樣的,所以查詢應在所有情況下正確運行。

如果您想要RY這個東西剛剛從鏈接下載數據庫,運行上面的查詢,並檢查了這兩部電影,阿凡達的作品,但不是哈特的戰爭

MATCH p=(a)-[]-() WHERE a.title = "Hart's War" OR a.title="Avatar" RETURN p

+0

不幸的數據庫尚未更新用的Neo4j的更高版本的工作,你必須遷移數據,雖然我不知道這解釋了你所看到的行爲,然而。您是否嘗試過使用':play movies'使用內置電影數據庫? – InverseFalcon

+0

@InverseFalcon您只需將'dbms.allow_format_migration = true'添加到neo4j的配置文件中,他就會爲您遷移格式! – user3351109

+0

嘗試與你鏈接的分貝,你的查詢工作得很好,所有的coactors似乎連接正確。您使用的是哪個版本的Neo4j,並且在圖表結果中是否有自動完成的功能? – InverseFalcon

回答

0

工作這個查詢應該做你需要的東西:

MATCH (p1:Actor)-[:ACTS_IN]->(m:Movie) 
MATCH (p2:Actor)-[:ACTS_IN]->(m) 
WHERE p2 <> p1 
OPTIONAL MATCH (p1)-[r:ACTED_WITH]-(p2) 
FOREACH (n IN (CASE WHEN r IS NULL THEN [0] ELSE [] END) | 
    MERGE (p1)-[:ACTED_WITH]->(p2) 
) 

我不知道這樣做是否最好做到這一點,但我相信這是有效的。

要在兩個節點之間創建:ACTED_WITH關係只有一次(而不是(a)-[:ACTED_WHT]->(b)(a)<-[:ACTED_WHT]-(b)),我正在使用this trick。基本我正在使用FOREACHCASE陳述模擬IF條件。

用Neo4j測試3.2。

Output

+0

我試過運行您的查詢,結果與我的相同,但它也會創建反向鏈接('(a) - [:ACTED_WHT] - >(b)和( a)< - [:ACTED_WHT] - (b)') 我的問題是,它不是沿着所有圖形創建的,而只是它的一個子集 – user3351109

+0

奇怪。在這裏使用Neo4j 3.2和Movie Database Dataset。我用打印屏幕更新了我的答案。請注意,我修改了關係類型和標籤。 –

+0

只需再次下載數據集,只運行您的查詢。 Clint Eastwood和Richard Harris唯一能找到的電影是「Unforgiven」,這是它在我的電腦上顯示的截圖。 http://imgur.com/a/6U0ht – user3351109