Neo4J Cypher:找出两个或多个相关的匹配节点,并将它们显示为组,而不重复所有可能的匹配组合

Neo4J Cypher:找出两个或多个相关的匹配节点,并将它们显示为组,而不重复所有可能的匹配组合,neo4j,cypher,Neo4j,Cypher,要求:找出两个或多个相关的匹配节点,并将它们显示为组,而不重复所有可能的匹配组合 数据结构: E1是实体1 N1是实体1的名称 P1是实体1的电话 E2是实体2 N2是实体2的名称 P2是实体2的电话 E3是实体3 N3是实体3的名称 P3是实体3的电话 使用的查询: start e1=node:entities('entityID:90754 OR entityID:113184 OR entityID:29472') match (n1)<-[:HAS_NAME]-(e

要求:找出两个或多个相关的匹配节点,并将它们显示为组,而不重复所有可能的匹配组合

数据结构:

E1是实体1 N1是实体1的名称 P1是实体1的电话

E2是实体2 N2是实体2的名称 P2是实体2的电话

E3是实体3 N3是实体3的名称 P3是实体3的电话

使用的查询:

    start e1=node:entities('entityID:90754 OR entityID:113184 OR entityID:29472')
    match (n1)<-[:HAS_NAME]-(e1)-[:HAS_PHONE]-(p1), (p1)-[m:MATCHES_TO]-(p2), (p2)-[:HAS_PHONE]-        (e2)-[:HAS_NAME]-(n2), (n1)-[nm:MATCHES_TO]-(n2) 
    return e1, n1, p1, collect(e2), collect(n2), collect(p2);
start e1=节点:实体('entityID:90754或entityID:113184或entityID:29472')

match(n1)您可以首先按照头实体名称(e1.name)对结果排序,并过滤掉名称小于头实体名称(e1.name)的任何相关实体(e2),因为这样的e2必须在当前行之前显示为行X的头元素,而e1必须在该行X中显示为相关实体,换句话说,就是对(e2,e1)已出现在前一行中

然后,您只需要排除没有相关实体的行,如下面的查询所示

Match (p1:EntityPhone)<-[:HasPhone]-(e1:Entity)-[:HasName]->(n1:EntityName), (p2:EntityPhone)<-[:HasPhone]-(e2:Entity)-[:HasName]->(n2:EntityName), (n1)-[:Matches]-(n2), (p1)-[:Matches]-(p2)
With e1.name as ename, filter(x in collect(e2.name): x > e1.name) as e2names
Order by ename
With ename, e2names, reduce(e2count = 0 , n in e2names : e2count + 1) as e2count
Where e2count > 0
Return ename, e2names
Match(p1:EntityPhone)(n1:EntityName),(p2:EntityPhone)(n2:EntityName),(n1)-[:Matches]-(n2),(p1)-[:Matches]-(p2)
使用e1.name作为ename,过滤器(collect(e2.name)中的x:x>e1.name)作为e2name
艾娜订购
对于ename,E2NAME,将(e2count=0,E2NAME中的n:e2count+1)减少为e2count
其中e2count>0
返回ename,e2name

这是用于此查询的web控制台,

首先,我看到您使用的是非定向关系。真的需要吗?第二,你有匹配的关系。为什么你不直接指向一款独特的手机,而不是不同的手机,它们会有这样的匹配关系?名字也一样。请您提供neo4j控制台上的示例以澄清问题?到目前为止,我已经这么做了:你能完成它吗?这样有人就可以在一个样本模型上尝试密码表达式了?@h3nrik,谢谢你的回答。该数据集与Lisa在上创建的数据集非常相似。我将使用它作为基础,然后在本地使用我自己的数据进行测试。