Neo4j 获取自相关节点的密码模式
鉴于我对Neo4j非常陌生。我有一个类似下图的模式: 这里的Neo4j 获取自相关节点的密码模式,neo4j,cypher,Neo4j,Cypher,鉴于我对Neo4j非常陌生。我有一个类似下图的模式: 这里的有节点不同,例如护照、商户、驾照等,而且这些节点描述客户节点(寻找基于这些节点过滤客户的未来范围) 相似是一种自我关系,意思是存在一个ID为1的客户与另一个ID为2的客户相关,得分为2800 我有以下问题: 考虑到我上面提到的未来范围的条件,这是一个好的模式,还是在单个客户节点中获取所有属性是可行的?(不同的节点也可能具有项目数组,例如:()-[:HAS]>(Phone)具有{active:“+91-1231241”,历史电话号码:[
有节点不同,例如护照、商户、驾照等,而且这些节点描述客户节点(寻找基于这些节点过滤客户的未来范围)
相似
是一种自我关系,意思是存在一个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”}
hasphone{active\u number:+91-12345”}
类似于customer{name:“Mike”}
hasphone{active\u number:+91-12345”}
。我们如何开始呢
如果有不清楚的地方,请询问。我可以举例说明。[编辑]
是的,模式看起来不错,只是不同的节点标签对之间不应该使用相同的HAS
关系类型
第一个查询的主要问题是,它的topMATCH
子句使用了一种定向关系模式,()-->()
,这不允许所有客户
节点都有机会成为搜索的
节点(因为某些节点可能仅位于类似的
关系的末尾)。这个经过调整的查询应该可以更好地工作:
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