反向参考neo4j

反向参考neo4j,neo4j,cypher,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) 其思想是,我只要求两条

我可以在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相同,而不指定它。它的全部目的不是生成所有可能的匹配,然后过滤它们,而是只在特定的位置跳转

我以更具体的方式问了一些类似的问题


Edit:我知道可以使用WHERE子句,但它们会在匹配边和节点后过滤查询。我想在比赛中做到这一点

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

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

更新

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

因此,您的问题是,匹配在筛选之前会创建所有关系对。使用
将匹配分为两个阶段如何

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)算法

否则,如果您转到JavaAPI(这意味着一个扩展或一个过程,取决于您的Neo4j版本),您可能可以通过以下方式在O(n)中实现

  • 扫描
    a
    b
    之间的所有关系,在一些多图中通过
    PatientID
    对它们进行索引(参见番石榴,或使用
    Map
    );这是O(n)
  • 然后对
    b
    c
    之间的所有关系执行相同的操作,仍然是O(n)
  • 对一个多重映射的键进行迭代,以获得两者中的值并进行匹配,仍然是O(n)

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

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

更新

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

因此,您的问题是,匹配在筛选之前会创建所有关系对。使用
将匹配分为两个阶段如何

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)算法

否则,如果您转到JavaAPI(这意味着一个扩展或一个过程,取决于您的Neo4j版本),您可能可以通过以下方式在O(n)中实现

  • 扫描
    a
    b
    之间的所有关系,在一些多图中通过
    PatientID
    对它们进行索引(参见番石榴,或使用
    Map
    );这是O(n)
  • 然后对
    b
    c
    之间的所有关系执行相同的操作,仍然是O(n)
  • 对一个多重映射的键进行迭代,以获得两者中的值并进行匹配,仍然是O(n)

这不是我想要的,当你这样做时,你会生成所有匹配,然后过滤!这是低效的!我不想生成所有匹配,只想生成ID为sameI的匹配。我已经根据您的额外上下文更新了答案。非常感谢!我想知道是否有关于如何更改JavaAPI的资料。带有“with”的版本似乎不起作用:/。您不需要更改Neo4j core API,您可以使用它或通过。关于带有
的版本,我只是这样写的,没有对任何数据进行测试,所以我很容易犯错误(即使我现在看不到);不管怎样,它看起来应该是这样的。你认为我可以用希腊语来完成吗?我目前正在使用带有python客户端的服务器,我正在使用py2neo接口访问服务器,我可以像调用任何其他函数一样调用该过程吗?因为我看到的所有示例都使用java,而不是查询本身。这不是我想要的,当你这样做时,你会生成所有匹配,然后过滤!这是低效的!我不想生成所有匹配,只想生成ID为sameI的匹配。我已经根据您的额外上下文更新了答案。非常感谢!我想知道是否有关于如何更改JavaAPI的资料。带有“with”的版本似乎不起作用:/。您不需要更改Neo4j core API,您可以使用它或通过。关于带有
的版本,我只是这样写的,没有对任何数据进行测试,所以我很容易犯错误(即使我现在看不到);不管怎样,它看起来应该是这样的。你认为我可以用希腊语来完成吗?我目前正在使用带有python客户端的服务器,我正在使用py2neo接口访问服务器,我可以像调用任何其他函数一样调用该过程吗?因为我看到的所有示例都使用java,而不是查询本身。