繁体   English   中英

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

[英]Neo4j Cypher: check attributes of not consecutive nodes in path

我有一张图表代表了不同城市的几个公共汽车/火车站。 让我们假设我想从城市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))

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

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

我怎样才能做到这一点? 有可能吗?

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

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

  • 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函数用于计算路径中的转换数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM