数据库 – Neo4j将属性值限制为仅x更改

有没有办法在Neo4J上说这样的查询

MATCH (p1:BusStop {idStop: "1293"}), (p2:BusStop {idStop: "1052"}),
  path = shortestpath((p1)-[:PATH*]->(p2))
RETURN path

我希望它为所有路径保留相同的属性值.

就像是 :

MATCH (p1:BusStop {idStop: "1293"}), (p2:BusStop {idStop: "1052"}),
  path = shortestpath((p1)-[:PATH*{busLineID: AlwaysTheSame}]->(p2))
RETURN path

但是我不想自己编写busLineID,因为我事先无法知道.

如果这是可能的话,也可以对neo4j说:在路径期间最多x次更改此属性的值?

谢谢

最佳答案 是的,您可以添加谓词以确保路径中的所有关系具有相同的属性值.

通过在两个节点之间的关系中找到共同的值,有助于首先找出所有可能的busLineID值.

MATCH (p1:BusStop {idStop: "1293"})-[r:PATH]-()
WITH p1, COLLECT(DISTINCT r.busLineID) as firstSet
MATCH (p2:BusStop {idStop: "1052"})-[r:PATH]-()
WITH p1, p2, firstSet, COLLECT(DISTINCT r.busLineID) as secondSet
WITH p1, p2, FILTER(id IN firstSet WHERE id IN secondSet) as commonIDs
UNWIND commonIDs as busLineID
MATCH path = shortestpath((p1)-[:PATH*]-(p2))
WHERE ALL(rel in RELATIONSHIPS(path) | rel.busLineID = busLineID)
RETURN path

提前知道值的好处是可以在计算shortestPath()时计算WHERE ALL子句,而不是在匹配所有可能的路径后将谓词应用为过滤器,这要慢得多.

关于你的第二个问题,关于允许财产价值改变,并试图限制这种改变,这是非常棘手的,至少据我所知.

首先,让我们尝试更轻松的事情.我们将首先找到所有最短路径,并找出每条最短路径发生的路由变化,按路径排序最少.我将在one of Christophe Willemsen’s answers中借用这个方法来解决一个相当类似的问题(当你有机会时,值得回顾):

MATCH (p1:BusStop {idStop: "1293"}), (p2:BusStop {idStop: "1052"})
MATCH p = allShortestPaths((p1)-[:PATH*]-(p2))
RETURN p, SIZE(FILTER(x in RANGE(0, SIZE(RELATIONSHIPS(p))) 
       WHERE (RELATIONSHIPS(p)[x]).busLineID <> (RELATIONSHIPS(p)[x-1]).busLineID)) as busLineChanges
ORDER BY busLineChanges ASC

但是如果你仍然希望返回最短的路径,允许公交线路切换在一个限度内,我很确定你将不得不放弃使用shortestPath()为此,因为我不相信你需要做的操作来弄清楚不同的busLineID更改的数量可以在MATCH或WHERE中完成,它需要在WITH或RETURN中完成,这不能用于shortestPath()(shortestPath()MATCH和WHERE将首先返回一个最短的路径,并且很可能您在查询的其余部分中的额外过滤将过滤掉单个shortestPath()结果).

您需要手动执行可变长度关系的匹配并向下过滤,并且该路径匹配可能会跨越整个图形.

我不认为这将是一个有效的查询,但我会试一试,我强烈建议你为你的变量添加一个上限:PATH关系(我现在将它添加进来,改变它在没有导致查询挂起的情况下对你有意义的事情:

MATCH (p1:BusStop {idStop: "1293"}), (p2:BusStop {idStop: "1052"})
MATCH path = (p1)-[rels:PATH*1..10]-(p2)
WITH path, SIZE(FILTER(x in RANGE(0, SIZE(rels)) 
           WHERE (rels[x]).busLineID <> (rels[x-1]).busLineID)) as busLineChanges
WHERE busLineChanges <= 3
RETURN path, busLineChanges
ORDER BY SIZE(path) ASC
LIMIT 1

我还鼓励您在可能的情况下为您的:PATH关系添加方向,这可能有助于路径匹配性能.

点赞