我正在尝试执行如下的Cypher查询:
MATCH p = shortestPath((a:Party { currency: 'GBP' })-[:IN_ESCROW { status: 'cleared' }]-(b:Party { currency: 'USD' }))
但是,它似乎并不尊重属性约束{status:'已清除},而是简单地返回恰好匹配的节点之间的所有最短路径:IN_ESCROW关系 . 虽然我找不到暗示这个特定情况的文档,但文档确实清楚地表明应该可以匹配关系属性 . 我错过了什么或者在Cypher中无法做到这一点?
目前正在使用Neo4j的社区版本2.1.3 . 先感谢您!
2 回答
我发现了自己询问的答案 . 事实证明,从我使用的2.1.3版本开始,shortestPath目前不支持对关系属性进行过滤 . 但是,有一个稍微昂贵的解决方法可用 . 请注意,这是比较昂贵的,因为它的性能略低于索引属性上的过滤器可能是Cypher支持的那种能力,但它并不慢 .
而不是:
您可以匹配shortestPath,然后通过使用谓词来强制执行属性约束:
这里的缺点显然是我们首先匹配所有可能的最短路径:两个匹配节点之间的IN_ESCROW关系,然后过滤以确保所有关系都包含期望的属性 . 就个人而言,我觉得这种行为不够直观 . 似乎shortestPath函数可能会先前排除所需的结果,因为它只是盲目地匹配关系类型,但在野外这个查询的工作方式正如我所需要的那样 .
到目前为止,这对我的表现如预期的那样 . 让我们希望Neo4j能够很快找到关于在关系上进行属性匹配的可靠语法!
这似乎是您当前的型号:
(p1:Party)-[:IN_ESCROW]->(p2:Party)
.你是否真的在一个托管方的双方之间有双向关系?如果是这样,也许其中一个关系没有
status: 'cleared'
,从而导致匹配 .===
此外,除了其他任何事情,你的模型似乎都被打破了,因为托管是两个平等政党之间的安排,因此似乎没有任何有序的方式来确定哪一方应该是关系的"head"(哪些应该是
p1
)是"tail"(p2
) . 它使您更有可能在两个方向上创建(基本上是多余的)关系 .我认为这种模式更有意义:
(p1:Party)<-[:HAS_PARTY]-(e:Escrow)-[:HAS_PARTY]->(p2:Party)
.