要求:找出两个或多个相关匹配节点并将其显示为组,而不重复所有可能的匹配组合
数据结构:
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);
查询输出
Row1 | entity1 | entity1的名字| entity1的电话entity2的电话,entity3的电话entity2的名称,entity3的名称| entity2的电话,entity3的电话
Row2 | entity2 | entity2的名字entity2的电话entity1的电话entity1的名字| entity1的电话
Row3 | entity3 | entity3的名字entity3的电话entity1的电话entity1的名字| entity1的电话
问题:只有结果集的第一行就足够了。第2行和第3行不是必需的,因为它们已经是第一行集合的一部分。
有人请帮助我如何构建一个密码查询,以便我在上面的示例中只获得一行
答案 0 :(得分:0)
您可以先按头实体名称(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
以下是此查询的Web控制台http://console.neo4j.org/?id=ljfbpb