0

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

数据结构:

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)

第 1 行 | 实体1 | 实体名称1 | entity1 的电话 | entity2 的电话,entity3 的电话 | entity2 的名称,entity3 的名称 | entity2的电话,entity3的电话

第 2 行 | 实体2 | 实体名称2 | entity2 的电话 | entity1 的电话 | 实体名称1 | 实体电话1

第 3 行 | 实体3 | 实体名称3 | entity3 的电话 | entity1 的电话 | 实体名称1 | 实体电话1

问题:只有结果集的第一行就足够了。第 2 行和第 3 行不是必需的,因为它们已经是第一行集合的一部分。

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

4

1 回答 1

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

于 2013-08-29T15:21:26.163 回答