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

    目前就这些小坑

  • 相关阅读:
    shell得到两个文件的差集
    shell 单引号&双引号的使用
    kubernetes session and 容器root权限
    docker 使用网络以及容器互联
    倒计时练习
    会话控制
    XML
    AJAX实现搜索智能提示
    弹窗显示详情练习
    三级联动
  • 原文地址:https://www.cnblogs.com/rockcode777/p/neo4jclient.html
Copyright © 2020-2023  润新知