当前位置: 首页 > 知识库问答 >
问题:

Neo4j图形数据库上的Cypher递归查询

艾国安
2023-03-14

有没有用Cypher编写递归查询的方法?我必须遍历从一组节点(带有标签L)到另一组节点(m,n,o,...)的所有路径。该图是定向的,并且有多个路径,如

> (m, n, o, p, ...) -[*]-> ({:L})

递归查询必须概述此伪代码

ForEach x where x HasLabel l:
    rec(x)
Def rec(node x):
    If x in (m, n, o, p):
         return
    ForEach y where y-->x:
         rec(y)
         x.prop = f(y.prop, x.prop)   
         //f(a,b) is a trivial arithmetic function with subtraction and division.

这个问题的解决方案不一定是递归的。任何其他解决方案都将受到赞赏。

编辑:在查询开始之前,根据需要将M.prop、N.prop、..设置为一些值。并且图中的所有其他节点(例如x)都有它们的x.prop=0

有多个定向路径,如(m,n,o,..)-[*]->({L})。对于这些路径中的每个节点x(m,n,o,..)-[*]->y-->x-[*]->({:l}),x.prop=x.prop+y.prop.

这是将属性从(m,n,o)传播到({:l})的一种方法。

示例:

a-->b-->c-->d:L
    ^
    |
e-->f-->g:L

在开始时,a.prop=1,e.prop=2和所有其他节点将prop作为0b.prop=f.prop=c.prop=d.prop=g.prop=0

Step 1: f.prop = 2
Step 2: b.prop = 1+2 = 3
Step 3: c.prop = 3, g.prop = 2
Step 4: d.prop = 3

当在每个节点x上递归定义为x.prop+=(y.prop+z.prop+...)时,此例程很容易,其中y-->x,z-->x,...

我希望这能澄清混乱。

编辑:在发布StackOverflow之前,我使用路径编写了一个查询。但是,foreach循环可能存在逻辑错误或问题。这可能有助于找到解决方案。

MATCH p=((u)-[*]->(v:L{}))
MATCH (x)-[]->(u)
WHERE x.id in ['m','n','o']
FOREACH(n in nodes(p) | set n.marked=x.marked+n.marked)

编辑:在我的查询中发现了问题。上面的查询为末尾标记为“L”的节点正确设置属性。但是,在类似这样的情况下,不会为路径中的节点正确设置属性

    c-->d:L
    ^   
    |
a-->b-->e:L

如果我的查询以a.marked=1开头,完成后将设置b.marked=2。因为b在两条路径中,它们指向标签为“l”的节点。但是,B.marked=1是期望值,因为它仅通过一条路径连接到节点A

共有1个答案

闾丘书
2023-03-14

我不是百分百确定我做的是对的。用英语描述一下你想做的事情可能会有帮助。不过,这里还是有一个小插曲:

MATCH path=(start)-[*0..5]-(:L)
WHERE start.prop > 0
WITH nodes(path)[-2] AS x, y
SET y.prop = (y.prop + x.prop)

因为我们正在进行变量路径匹配,path将查找从l到以入站方式连接到它的每个节点的每个路径。我们不包括排除列表中的任何y值。然后,对于找到的每个路径,我们取倒数第二个(x)和最后一个(y),并进行计算和set

希望有帮助!

编辑:从您的示例来看,似乎您想要匹配关系,而不考虑方向(似乎您只想匹配到达起始点的路径)。我删除了小于(<),使路径双向匹配。我也做了一些其他的改变,现在我更好地理解了这个问题,我认为这可能会有帮助。

还要记住,我对变量路径的大小添加了一个限制。您可能希望根据图形的大小/拓扑将其调整为更大(或完全不受限制)。还要注意,-[*]-匹配(我认为)从长度为1的路径到无限长的路径。因此,如果您采用我的解决方案,您可能希望使用-[0..],因为零路径长度匹配的选项对它至关重要。

 类似资料:
  • 我有一个用户域:1)字符串用户名,2)字符串密码,3)角色[]角色(角色是枚举)。 my UserRepository中的方法如下所示: 这将引发,因为它无法将String转换为Roles,这是一个枚举。如果我摆脱了{0}周围的引号。角色,那么它会抛出这个: 如果User参数可以直接序列化到MERGE查询中,或者以任何方式解析此Roles[],这将是理想的。 有人能帮我吗?我使用的是SDN3.1。

  • 问题内容: 问候, 除了Neo4J之外 , 是否有任何可用的开源图形数据库? 注意: 为什么不选择Neo4J? Neo4J是开源的,但是可以计算基元(节点数,关系和属性)。如果您将其用于商业用途。并且在官方网站上没有任何直接的定价信息。因此可能存在潜在的供应商锁定(尽管我刚成立我的公司,而且没有预算在软件上花钱。)所以这是不可行的。 问候, 问题答案: 如RobV所说,如果您的图形几乎可以以任何自

  • 我的neo4j服务器有一个非托管扩展。 代码如下。 当我部署代码时,我得到了500个内部错误。如果我删除代码 Result result = database.execute( “MATCH (n:KISI) where id(n)=1 return n” ); 然后一切都很好。 我检查了日志文件,错误如下 2015年8月13日3:34:36AM com . sun . jersey . SPI

  • 我在Neo4j图形数据库上使用GRANDstack创建一个应用程序,我正在努力编写一个查询,该查询解压缩一个属性数组,匹配一些ID,拉回与ID相关的名称,并将它们重新打包到一个新的数组中。 本质上,我有内存节点(Mems)和Person节点(Person),它们的关系如下:(Mems)-[WITH]->(Person)。也就是说,你可以对你和多个人在一起的事情有一个记忆。Mems节点包含perso

  • 我是Spring data neo4j的新手,我对GraphRepository有一些错误/问题。 我第一次有了这个: 但是阅读一些文档,存储库已经提供了这样的方法。我不需要写它们。 这是我的产品域名。 这是我的实验班 未检测到查找字节 Id 这正常吗? 这是我的pom.xml

  • Cypher对我来说似乎比Gremlin要清楚得多,总的来说,Neo4j的家伙似乎都在和Cypher一起。但是--如果Cypher与Gremlin相比是有限的--我真的想提前知道这一点。