Neo4j 获取自相关节点的密码模式

Neo4j 获取自相关节点的密码模式,neo4j,cypher,Neo4j,Cypher,鉴于我对Neo4j非常陌生。我有一个类似下图的模式: 这里的有节点不同,例如护照、商户、驾照等,而且这些节点描述客户节点(寻找基于这些节点过滤客户的未来范围) 相似是一种自我关系,意思是存在一个ID为1的客户与另一个ID为2的客户相关,得分为2800 我有以下问题: 考虑到我上面提到的未来范围的条件,这是一个好的模式,还是在单个客户节点中获取所有属性是可行的?(不同的节点也可能具有项目数组,例如:()-[:HAS]>(Phone)具有{active:“+91-1231241”,历史电话号码:[

鉴于我对Neo4j非常陌生。我有一个类似下图的模式:

这里的
节点不同,例如
护照、商户、驾照等
,而且这些节点描述客户节点(寻找基于这些节点过滤客户的未来范围)

相似
是一种自我关系,意思是存在一个ID为
1的客户
与另一个ID为
2的客户
相关,得分为
2800

我有以下问题:

  • 考虑到我上面提到的未来范围的条件,这是一个好的模式,还是在单个客户节点中获取所有属性是可行的?(不同的节点也可能具有项目数组,例如:
    ()-[:HAS]>(Phone)
    具有
    {active:“+91-1231241”,历史电话号码:[“+91-121213”,“+91-1231421”]}
  • 我希望了解客户,并描述与其他客户相关的节点。为此,我尝试了以下查询(关系数不超过1):
  • 结果我得到的结果如下,注意一个客户节点没有其描述节点:

    //没有关系的数量\u>1
    //第二次尝试-针对示例客户id
    匹配(匹配)(b)
    其中尺寸(键(b))>0
    和c.customer_id=“1b093559-a39b-4f95-889b-a215cac698dc”
    r.得分>2700分
    返回b作为道具,c作为src_cust,r作为关系,匹配
    
    我得到的结果如下,请注意,相关节点没有其描述节点:

  • 如果我有两个具有某些属性的描述节点(有些可能有一个列表),我想在这些节点上查询并构建上面第2点中指定的预期图,我该怎么做

  • 我希望数据库在给定描述节点的情况下找到类似的客户。示例:
    customer{name:“Dave”}
    has
    phone{active\u number:+91-12345”}
    类似于
    customer{name:“Mike”}
    has
    phone{active\u number:+91-12345”}
    。我们如何开始呢

  • 如果有不清楚的地方,请询问。我可以举例说明。

    [编辑]

  • 是的,模式看起来不错,只是不同的节点标签对之间不应该使用相同的
    HAS
    关系类型
  • 第一个查询的主要问题是,它的top
    MATCH
    子句使用了一种定向关系模式,
    ()-->()
    ,这不允许所有
    客户
    节点都有机会成为
    搜索的
    节点(因为某些节点可能仅位于
    类似的
    关系的末尾)。这个经过调整的查询应该可以更好地工作:

    MATCH (searched:Customer)-[r:SIMILAR]-(matched:Customer)
    WHERE r.score > 2700
    WITH searched, COLLECT(matched) AS matchedList
    WHERE SIZE(matchedList) > 1
    UNWIND matchedList AS person
    MATCH (person)-[:HAS|LIVES_IN|IS_EMPLOYED_BY]->(pDesc)
    WITH searched, person, COLLECT(pDesc) AS personDescribers
    MATCH (searched)-[:HAS|LIVES_IN|IS_EMPLOYED_BY]->(sDesc)
    RETURN searched, person, personDescribers, COLLECT(sDesc) AS searchedDescribers
    
  • 不清楚你想做什么

  • 要获取所有电话号码相同的
    客户
    s,请执行以下操作:

    MATCH (c:Customer)-[:HAS_PHONE]-(p:Phone)
    WHERE p.activeNumber = '+91-12345'
    WITH p.activeNumber AS phoneNumber, COLLECT(c) AS customers
    WHERE SIZE(customers) > 1
    RETURN phoneNumber, customers
    

  • 感谢您指出
    。另外,对于第二点中的
    -->
    。经过很长一段时间的研究,我找到了无法获得所有
    客户节点
    描述节点的部分。关于第三点,它是关于过滤的,无论如何都会涉及到。第四点,例如,如果我没有明确提供p.activeNumber,那么如何才能获得具有匹配电话号码节点的客户?只需在分析结果数据时省略第一个
    WHERE
    子句即可。存在一种关系冗余,即对于一条记录,我得到2,即
    a-->B
    B-->a
    。通过删除
    -->
    可以实现这一点,但如何在没有重复记录的情况下实现同样的效果。您是在谈论我的第一个查询吗?你能举一个“复制”的例子吗?我犯了一个幼稚的错误。谢谢,@cybersam不介意我在任何与cypher有关的问题上给你贴标签。
    MATCH (searched:Customer)-[r:SIMILAR]-(matched:Customer)
    WHERE r.score > 2700
    WITH searched, COLLECT(matched) AS matchedList
    WHERE SIZE(matchedList) > 1
    UNWIND matchedList AS person
    MATCH (person)-[:HAS|LIVES_IN|IS_EMPLOYED_BY]->(pDesc)
    WITH searched, person, COLLECT(pDesc) AS personDescribers
    MATCH (searched)-[:HAS|LIVES_IN|IS_EMPLOYED_BY]->(sDesc)
    RETURN searched, person, personDescribers, COLLECT(sDesc) AS searchedDescribers
    
    MATCH (c:Customer)-[:HAS_PHONE]-(p:Phone)
    WHERE p.activeNumber = '+91-12345'
    WITH p.activeNumber AS phoneNumber, COLLECT(c) AS customers
    WHERE SIZE(customers) > 1
    RETURN phoneNumber, customers