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

时间:2016-12-23 21:35:38

标签: neo4j cypher

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

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

我尝试通过过滤掉具有特殊特征的结果来避免循环,例如:克。

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

现在我想避免不止一次访问一个城市的可能性,e。 G。代替a1 - &gt; a2 - &gt; d2 - &gt; d4 - &gt; a3 - &gt; a4 - &gt; z1我想获得a1 - &gt; a4 - &gt; z1。< / p>

因此我必须检查路径中的所有节点。如果连续节点的n.city值相同,那么一切都很好。但是,如果我得到一条同一城市的节点不连续的路径,e。 G。 cityA - &GT; cityB - &gt; cityA我想扔掉那条路。

我该怎么做?有可能吗?

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

1 个答案:

答案 0 :(得分: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函数用于计算路径中的转换次数。