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

时间:2013-08-29 07:30:30

标签: 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]-(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);

查询输出

#| e1 | n1 | p1 |收集(e2)|收集(n2)|收集(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行不是必需的,因为它们已经是第一行集合的一部分。

有人请帮助我如何构建一个密码查询,以便我在上面的示例中只获得一行

1 个答案:

答案 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