有没有用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
作为0
即b.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
。
我不是百分百确定我做的是对的。用英语描述一下你想做的事情可能会有帮助。不过,这里还是有一个小插曲:
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相比是有限的--我真的想提前知道这一点。