Neo4j填坑記錄-Neo4jClient建立節點、建立關系相關


最近一個項目需要用到知識圖譜,選用了neo4j圖數據庫,在這過程中遇到幾個坑,記錄一下

 

1.無法登錄,瘋狂提示“WebSocket connection failure. Due to security constraints in your web browser”

我的測試環境是在docker中運行的,google的辦法都是改配置文件中的監聽地址什么的,最后也沒能找到解決辦法。陰差陽錯換回3.5.16版本就好了。這個問題我也不確定問題根源,並不是說4.0版本就一定會有這個問題。

 

2.neo4jClient建立節點,建立關系

種種原因,寫數據到neo4j的程序是c#寫的。比較常見的驅動有兩個,一個是官方的neo4j-dotnet-driver,另一個是第三方的Neo4jClient. 我用的是第三方這個。

最有用的官方文檔就這一篇:https://github.com/Readify/Neo4jClient/wiki/cypher-examples

同類型節點建立關系沒有問題,比如Person1認識Person2這種,在“Relate two existing users”這塊很詳細了。

問題就出在非同一類型的節點建立關系的時候,比如Person1擁有Book1這樣,使用官方那個sample是不行的。搜遍全網也沒找到解決方案,這里記錄一下。

如果按照官方文檔來寫Cypher,是這樣的(以官方movie數據庫為例)。

MATCH (p:Person), (m:Movie)
WHERE p.name="J.T. Walsh" , m.title="Unforgiven"
CREATE (p)-[r:ACTED_IN]->(m)
return r

執行結果會報錯

 

 正確的是這樣

MATCH (p:Person), (m:Movie)
WHERE p.name="J.T. Walsh" and m.title="Unforgiven"
CREATE (p)-[r:ACTED_IN]->(m)
return r

與官方文檔中同類型節點不同的是,where條件中兩個條件中的逗號,改為 "and"

 

 

使用Neo4jClient寫入的話,同樣需要修改一下。

官方sample:

graphClient.Cypher
    .Match("(user1:User)", "(user2:User)")
    .Where((User user1) => user1.Id == 123)
    .AndWhere((User user2) => user2.Id == 456)
    .Create("user1-[:FRIENDS_WITH]->user2")
    .ExecuteWithoutResults();

正確寫法(注意CreateUnique后面的d和s必須用小括號包起來,不然也是瘋狂報錯

 _graphClient.Cypher
                                .Match("(d:Person)", "(s:Movie)")
                                .Where((Person d) => d.name =="aaa")
                                .AndWhere((Movie s) => s.name == "bbb")
                                .CreateUnique("(d)-[:ACTED_IN{rel}]->(s)")
                                .WithParam("rel", new { name="扮演" })
                                .ExecuteWithoutResults();

當然,如果關系不需要有屬性的話是這樣的,去掉rel就可以了

                             _graphClient.Cypher
                                .Match("(d:Person)", "(s:Movie)")
                                .Where((Person d) => d.name =="aaa")
                                .AndWhere((Movie s) => s.name == "bbb")
                                .CreateUnique("(d)-[:ACTED_IN]->(s)")
                                .ExecuteWithoutResults();                

 

目前就這些小坑


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM