Neo4j Cypher:检查路径中不连续节点的属性

Posted

技术标签:

【中文标题】Neo4j Cypher:检查路径中不连续节点的属性【英文标题】:Neo4j Cypher: check attributes of not consecutive nodes in path 【发布时间】:2016-12-23 21:35:37 【问题描述】:

我有一张图表,它代表了不同城市的几个公共汽车/火车站。 假设我想从城市 A(停靠点 a1、a2、a3...)到城市 Z(停靠点 z1、z2...)

节点之间有几条路线(关系),我想获得起点和终点节点之间的所有路径。实际上,我的成本向量会很复杂(旅行时间和等待时间以及价格和和...),因此我不能使用最短路径等。我设法编写了一个(非常复杂的)查询来满足我的需求:一般来说正在寻找每个可用的开始 A 和结束 Z 的匹配。

我试图通过过滤掉具有特殊特征的结果来避免循环,例如。 g.

MATCH (fromname:'a1'), (toname:'z1'),
path = (from)-[:CONNECTED_TO*0..8]->(to)    
WHERE ALL(b IN NODES(path) WHERE SINGLE(c IN NODES(path) WHERE b = c))

现在我想避免多次访问一个城市的可能性,例如。 G。而不是 a1-->a2-->d2-->d4-->a3-->a4-->z1 我想得到 a1-->a4-->z1。

因此我必须检查路径中的所有节点。如果连续节点的 n.city 值相同,则一切正常。但是,如果我的路径包含不连续的同一城市的节点,例如。 G。 cityA--> cityB-->cityA 我想扔掉那条路。

我该怎么做?有什么可能吗?

我知道,这并不是一个真正美丽的方法,但是我花了很多时间来寻找更好的方法,而没有丢弃整个数据结构,但我找不到。它只是一个原型,Neo4j 不是我的重点。我想测试一些工具和产品来积累一些知识。下次我会采用更好的方法。

【问题讨论】:

【参考方案1】:

有趣的问题。这里要注意的重要一点是,一条永远不会重新访问一个城市(离开城市之后)的路径必须在城市之间的转换少于不同城市的数量。例如:

AABBC(“好”路径)有 3 个不同的城市和 2 个转换 ABBAC(一条“坏”路)也有 3 个不同的城市,但有 3 个过渡

考虑到这一点,以下查询应该可以工作(即使起始节点和结束节点相同):

MATCH path = (name:'a1')-[:CONNECTED_TO*0..8]->(name:'z1')
WITH path, NODES(path) as ns
WITH path, ns,
  REDUCE(s = cnt: 0, last: ns[0].city, x IN ns[1..] |
    CASE WHEN x.city = s.last THEN s ELSE cnt: s.cnt+1, last: x.city END).cnt AS nTransitions
UNWIND ns AS node
WITH path, nTransitions, COUNT(DISTINCT node.city) AS nCities
WHERE nTransitions < nCities
RETURN path;

REDUCE 函数用于计算路径中的转换次数。

【讨论】:

这是个好主意!它按预期工作。现在我只需要整合我的其他陈述。如果我遇到问题,我会再写一次。非常感谢!

以上是关于Neo4j Cypher:检查路径中不连续节点的属性的主要内容,如果未能解决你的问题,请参考以下文章

neo4j cypher 节点可以模糊匹配么

知识图谱Neo4j Cypher查询语言详解

Neo4j cypher查询获取起始节点和结束节点之间的所有节点

Neo4j Cypher 复杂查询优化

Neo4j 第十一篇:Cypher函数

使用 Cypher 从 Neo4j 图中提取子图