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次更改此属性的值?
由于
答案 0 :(得分:1)
是的,您可以添加谓词以确保路径中的所有关系具有相同的属性值。
通过在两个节点之间的关系中找到共同的值,首先找出所有可能的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(),因为我不相信你需要做的操作弄清楚可以在MATCH或WHERE中完成不同的busLineID更改的数量,它需要在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关系添加方向,这可能有助于路径匹配性能。