反向引用neo4j

时间:2016-07-07 14:33:16

标签: neo4j cypher

我可以在neo4j中使用一些反向引用的机制吗?我对匹配查询的内容不感兴趣,只是在很多地方都是一样的。类似的东西:

MATCH (a:Event {diagnosis1:11})
MATCH (b:Event {diagnosis1:15})
MATCH (c:Event {diagnosis1:5})
MATCH (a)-[rel:Next {PatientID:*}]->(b)
MATCH (b)-[rel1:Next {PatientID:\{1}]->(c)

我的想法是,我只要求两个边的属性ID相同,而不指定它。它的全部目的不是产生所有可能的匹配,然后过滤它们,而只是跳到特定的地方。

我以更具体的方式询问了类似的事情here

编辑:我知道可以使用WHERE子句,但是他们在匹配边和节点后过滤查询。我想在匹配期间做到这一点!

1 个答案:

答案 0 :(得分:4)

使用带有简单引用的WHERE子句,不需要反向引用:

MATCH (a)-[rel:Next]->(b)
MATCH (b)-[rel1:Next]->(c)
WHERE rel.PatientID = rel1.PatientID

<强>更新

首先,Cypher是一种声明性的查询语言:你表达了你想要的东西,运行时负责以任何方式执行和优化它,所以它不会像你认为的那样去做。或者使用“反向引用”会神奇地解决问题;这只是写同样事物的另一种方式。

因此,您的问题是匹配会在过滤之前创建所有关系对。如何使用WITH分成两个阶段的匹配?

MATCH (a:Event {diagnosis1:11})-[rel:Next]->(b:Event {diagnosis1:15})
WITH a, b, rel
MATCH (b)-[rel1:Next]->(c:Event {diagnosis1:5})
WHERE rel1.PatientID = rel.PatientID

那应该只选择与第一个匹配的第二个关系,但我不确定它是否是Cypher运行时的O(n ^ 2)算法。

否则,如果你转到Java API(这意味着扩展或程序,取决于你的Neo4j的版本),你可以在O(n)中实现

  • 扫描ab之间的所有关系,在某个多地图中按PatientID索引它们(请参阅番石榴,或使用Map<K, Collection<V>>);这是O(n)
  • 然后为bc之间的所有关系做同样的事情,仍然是O(n)
  • 迭代一个多图的键以获取两者中的值并匹配它们,仍为O(n)