按数字和对路径进行排序



我有下面的图

(a1:A {name:'a1', s:1})  ->                            -> (a3:A {name:'a3',s:11})
(a2:A {name:'a2', s:10}) -> (b1:B) -> (c1:C) -> (b2:B) -> (a4:A {name:'a4',s:123})

在左侧,有2个类型A节点连接到左侧的同一类型B节点。在右侧,有2个类型A节点连接到右侧的另一个类型B节点。每个A类节点都有一个名为s的属性,该属性表示分数。

如果我做一个像这样的简单查询

match p=((a1:A)--(b1:B)--(:C)--(b2:B)--(a2:A))
where a1.name in ['a1', 'a2']
return p

我将获得4条路径,无需任何排序。然而,我希望路径是基于路径两端A类节点的总得分的顺序,即

(:A {name:'a2', s:10}) -> (b1:B) -> (c1:C) -> (b2:B) -> (:A {name:'a4',s:123})
(:A {name:'a1', s:1}) -> (b1:B) -> (c1:C) -> (b2:B) -> (:A {name:'a4',s:123})
(:A {name:'a2', s:10}) -> (b1:B) -> (c1:C) -> (b2:B) -> (:A {name:'a3',s:11})
(:A {name:'a1', s:1}) -> (b1:B) -> (c1:C) -> (b2:B) -> (:A {name:'a3',s:11})

我可以通过密码实现吗?

一个选项是将分数添加到每个路径:

match p=((a1:A)--(b1:B)--(:C)--(b2:B)--(a2:A))
where a1.name in ['a1', 'a2']
WITH p, a1.s + a2.s AS score
return p, score
ORDER BY score DESC

如果我在这个样本数据上使用它:

MERGE (a1:A{name:'a1', s:1, key: 0})
MERGE (a2:A{name:'a2', s:10, key: 1})
MERGE (b1:B{key: 2})
MERGE (c1:C{key: 3})
MERGE (b2:B{key: 4})
MERGE (a3:A{name:'a3',s:11, key: 5})
MERGE (a4:A{name:'a4',s:123, key: 6})
MERGE (a1)-[:LINKS]-(b1)
MERGE (a2)-[:LINKS]-(b1)
MERGE (b1)-[:LINKS]-(c1)
MERGE (c1)-[:LINKS]-(b2)
MERGE (b2)-[:LINKS]-(a3)
MERGE (b2)-[:LINKS]-(a4)

结果是:

╒══════════════════════════════════════════════════════════════════════╤═══════╕
│"p"                                                                   │"score"│
╞══════════════════════════════════════════════════════════════════════╪═══════╡
│[{"name":"a2","s":10,"key":1},{},{"key":2},{"key":2},{},{"key":3},{"ke│133    │
│y":3},{},{"key":4},{"key":4},{},{"name":"a4","s":123,"key":6}]        │       │
├──────────────────────────────────────────────────────────────────────┼───────┤
│[{"name":"a1","s":1,"key":0},{},{"key":2},{"key":2},{},{"key":3},{"key│124    │
│":3},{},{"key":4},{"key":4},{},{"name":"a4","s":123,"key":6}]         │       │
├──────────────────────────────────────────────────────────────────────┼───────┤
│[{"name":"a2","s":10,"key":1},{},{"key":2},{"key":2},{},{"key":3},{"ke│21     │
│y":3},{},{"key":4},{"key":4},{},{"name":"a3","s":11,"key":5}]         │       │
├──────────────────────────────────────────────────────────────────────┼───────┤
│[{"name":"a1","s":1,"key":0},{},{"key":2},{"key":2},{},{"key":3},{"key│12     │
│":3},{},{"key":4},{"key":4},{},{"name":"a3","s":11,"key":5}]          │       │
└──────────────────────────────────────────────────────────────────────┴───────┘

我不知道你说的"得分";。

您可以查看ORDPATH,它根据层次结构进行排序。您可以按分数对路径进行排序,然后使用ORDPATH。GitHub上有一个功能。输入需要数字,因此您可能必须使用分数或关系ID。

你可以在博客文章中看到这是如何实现的

如果Neo4j开发人员将其纳入APOC,那就太好了。

最新更新