Neo4j:如何根据关系的权重找到不同的单跳路径?
Neo4j: How to find distinct one-hop paths based on the weight of the relationships?
在此示例图中,我想要一个查询,当一对节点在节点对之间定义了多个单跳关系时,该查询将 select 不同的单跳路径。我想要select权重最高的一跳关系
MATCH (x:FooNode) DETACH DELETE x RETURN COUNT(*);
CREATE CONSTRAINT ON (x:FooNode) ASSERT x.name IS UNIQUE;
CREATE (a:FooNode {name: 'a'}), (b:FooNode {name: 'b'}), (c:FooNode {name: 'c'}),
(d:FooNode {name: 'd'}), (e:FooNode {name: 'e'}), (f:FooNode {name: 'f'}),
(a)-[:FooRelation1 {weight: 1}]->(b),
(a)-[:FooRelation2 {weight: 2}]->(b),
(a)-[:FooRelation3 {weight: 3}]->(b),
(a)-[:FooRelation2 {weight: 2}]->(e),
(a)-[:FooRelation4 {weight: 4}]->(e),
(a)-[:FooRelation6 {weight: 6}]->(e),
(e)-[:FooRelation1 {weight: 3}]->(c),
(e)-[:FooRelation2 {weight: 1}]->(f),
(c)-[:FooRelation3 {weight: 3}]->(d);
MATCH p = (s:FooNode) -[r]-> (t:FooNode)
WITH DISTINCT {left: s.name, right: t.name} as Distincts
RETURN Distincts
例如,我希望 (a)-[:FooRelation3 {weight: 3}]->(b) 被 returned 而不是 (a)-[:FooRelation1 {weight: 1} ]->(b), (a)-[:FooRelation2 {weight: 3}]->(b) 基于权重,所有 3 都是从 (a) 到 (b).
想法?
更新
出于某种原因,Whosebug 不允许我 post 将此作为答案,但看起来我找到了一些有用的东西。我仍然会感谢您的反馈。
MATCH p = (n:FooNode)-[r]->(m:FooNode)
WITH DISTINCT n, m, max(r.weight) AS maxw
MATCH p2 = (n2)-[r2]->(m2)
WHERE n2.name = n.name AND m2.name = m.name AND r2.weight = maxw
RETURN p2, type(r2)
从技术上讲,我只需要 return p2。
注意:查看图表时请确保自动完成功能已关闭; else Neo4j 会自动显示相关关系(这肯定会让你失望)。
我们可以通过重复使用已在范围内的节点和关系的变量来改进您找到的查询。
MATCH (n:FooNode)-[r]->(m:FooNode)
// no need for distinct since you're using the max() aggregation
WITH n, m, max(r.weight) AS maxw
MATCH p = (n)-[r]->(m)
WHERE r.weight = maxw
RETURN p, type(r)
但是,如果存在多个具有相同最大权重的关系,这将 return 所有这些而不是一个。
在此示例图中,我想要一个查询,当一对节点在节点对之间定义了多个单跳关系时,该查询将 select 不同的单跳路径。我想要select权重最高的一跳关系
MATCH (x:FooNode) DETACH DELETE x RETURN COUNT(*);
CREATE CONSTRAINT ON (x:FooNode) ASSERT x.name IS UNIQUE;
CREATE (a:FooNode {name: 'a'}), (b:FooNode {name: 'b'}), (c:FooNode {name: 'c'}),
(d:FooNode {name: 'd'}), (e:FooNode {name: 'e'}), (f:FooNode {name: 'f'}),
(a)-[:FooRelation1 {weight: 1}]->(b),
(a)-[:FooRelation2 {weight: 2}]->(b),
(a)-[:FooRelation3 {weight: 3}]->(b),
(a)-[:FooRelation2 {weight: 2}]->(e),
(a)-[:FooRelation4 {weight: 4}]->(e),
(a)-[:FooRelation6 {weight: 6}]->(e),
(e)-[:FooRelation1 {weight: 3}]->(c),
(e)-[:FooRelation2 {weight: 1}]->(f),
(c)-[:FooRelation3 {weight: 3}]->(d);
MATCH p = (s:FooNode) -[r]-> (t:FooNode)
WITH DISTINCT {left: s.name, right: t.name} as Distincts
RETURN Distincts
例如,我希望 (a)-[:FooRelation3 {weight: 3}]->(b) 被 returned 而不是 (a)-[:FooRelation1 {weight: 1} ]->(b), (a)-[:FooRelation2 {weight: 3}]->(b) 基于权重,所有 3 都是从 (a) 到 (b).
想法?
更新
出于某种原因,Whosebug 不允许我 post 将此作为答案,但看起来我找到了一些有用的东西。我仍然会感谢您的反馈。
MATCH p = (n:FooNode)-[r]->(m:FooNode)
WITH DISTINCT n, m, max(r.weight) AS maxw
MATCH p2 = (n2)-[r2]->(m2)
WHERE n2.name = n.name AND m2.name = m.name AND r2.weight = maxw
RETURN p2, type(r2)
从技术上讲,我只需要 return p2。
注意:查看图表时请确保自动完成功能已关闭; else Neo4j 会自动显示相关关系(这肯定会让你失望)。
我们可以通过重复使用已在范围内的节点和关系的变量来改进您找到的查询。
MATCH (n:FooNode)-[r]->(m:FooNode)
// no need for distinct since you're using the max() aggregation
WITH n, m, max(r.weight) AS maxw
MATCH p = (n)-[r]->(m)
WHERE r.weight = maxw
RETURN p, type(r)
但是,如果存在多个具有相同最大权重的关系,这将 return 所有这些而不是一个。