最近一個項目需要用到知識圖譜,選用了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();
目前就這些小坑