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();                

 

目前就这些小坑

posted @ 2020-05-06 16:06  rockcode777  阅读(1528)  评论(0编辑  收藏  举报