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();
目前就这些小坑