use*_*478 2 neo4j graph-databases cypher
我在节点之间有重复的关系,例如:
A ->{weight: 1} B
A ->{weight: 1} B
A ->{weight: 1} B
Run Code Online (Sandbox Code Playgroud)
我希望将这些关系合并为一个形式的关系:A - > {weight:3} B用于我的整个图形.
我尝试过以下内容:
start n = node(*)
match (n)-[r:OCCURENCE]->()
Set r.weight = count(*)
count(*)
Run Code Online (Sandbox Code Playgroud)
但是我的图表非常大,并且对于每个节点A和B,此查询边缘会更新两次.此外,旧关系不会被删除.不知道如何在一个查询中对这两个方面进行建模.希望有人能提供帮助.
编辑:
尝试使用node()和relationship()等其他一些查询
start n = node(*) match ()-[r:OCCURENCE]->() set n.SumEdgeWeight = sum(r.weight)
Run Code Online (Sandbox Code Playgroud)
他们处理的速度很慢.当我需要更新所有节点时,还有其他更快的方法吗?我在Neo4j社区找到了这个主题[1].我的查询是否有可能更快地运行java核心api?
[1] https://groups.google.com/forum/#!topic/neo4j/4SSxvNsuQsY
问候.
node(*)您可以从更合适的模式开始(),而不是从匹配每个节点()的非常一般的模式开始A-[:OCCURRENCE]->B.这可能会加快速度.
您可以聚合权重值而不是计算节点以计算聚合权重(您似乎在编辑中转向,但您将权重聚合设置为节点上的属性).也许你的数据所有的关系都有1的权重,如果有的话,某种计数可以起作用(你可以尝试计算关系而不是节点),但是可能值得一个不能产生正确结果的查询偶然.这样的查询也可以使用不同的权重值,例如,如果您将来导入更多数据并且需要合并新[OCCURRENCE]关系(可能权重为1),并且已经合并到位.
你能尝试这样的吗?
MATCH (A)-[r:OCCURRENCE]->(B)
WITH A, COLLECT(r) as oldRels, B, SUM(r.weight) as W
FOREACH(r IN oldRels | DELETE r)
WITH A, W, B
CREATE (A)-[O:OCCURRENCE {weight:W}]->(B);
Run Code Online (Sandbox Code Playgroud)
我将此查询的含义视为:对于A-[r:OCCURRENCE]->B图中的所有模式,COLLECT关系并带来该集合,WITH以便以后可以删除它们.还带来WITH相关节点和SUM关系的权重.FOREACH旧关系,删除它,并WITH只带来两个节点和聚合权重.创建新关系并将权重设置为聚合权重.
| 归档时间: |
|
| 查看次数: |
2479 次 |
| 最近记录: |