【问题标题】:Neo4j implementing commentsNeo4j 实现注释
【发布时间】:2015-09-22 08:12:24
【问题描述】:

在我的 Spring Boot/Neo4j 应用程序中,我有一个 Neo4j 节点的大树,现在我想为每个节点实现分层 cmets。

现在我正在考虑这些 cmets 必须放在什么位置...在 Neo4j 数据库或其他一些外部 RDBMS/NoSQL 存储中。

我为什么要考虑这个问题 - 由于我目前对 Cypher 的了解有限,我面临着删除重型 Neo4j 节点(与其他节点有很多关系的复合节点)的问题。我无法解决这个问题现在问题.. 所以引入新的评论节点可以完全杀死我的系统。

那么你认为,我应该尝试修复删除问题还是在一些外部数据存储中实现评论?

更新

这是我的慢速删除查询:

MATCH (d:Decision) 
WHERE id(d) IN {decisionsIds} 
OPTIONAL MATCH (d)-[r]-(t) 
DELETE d, r 
WITH t, r WHERE NOT (id(t) IN {decisionsIds}) 
OPTIONAL MATCH (t)-[r2:VOTED_ON|:CREATED_BY|:VOTED_FOR]-()-[r3:CONTAINS]-(t2) WHERE r2 <> r 
WITH t, r2, t2, r3 
WHERE none(x in labels(t) 
WHERE x in ['User', 'Decision']) 
DELETE t, r2, t2, r3

现在这个查询工作了很长时间,所以我害怕向决策节点添加新实体以免完全破坏性能。

有什么方法可以优化这个查询吗?

【问题讨论】:

  • 或许可以提供更多关于您目前所做工作的详细信息?你的描述很模糊。一般来说,处理 cmets 树对 Neo4j 来说不是问题。
  • 我已经添加了我的删除查询。这个查询工作了很长时间,所以我现在不敢向决策节点添加新实体
  • 如果您也可以共享配置文件或示例数据库来测试它,那就太好了。
  • 你用的是哪个版本?
  • Neo4j 2.2.5 SDN 3.4.0.RELEASE。我现在要创建一个示例数据库

标签: architecture neo4j cypher


【解决方案1】:

如果没有数据库,这是一个小的优化尝试,不确定是否有帮助。

了解更多关于域模型和元素之间的基数(例如 dt 之间的基数)也会很好

MATCH (d:Decision) WHERE id(d) IN {decisionsIds} 
OPTIONAL MATCH (d)-[r]-(t) 
DELETE d, r 
WITH t, collect(r) as rels 
  WHERE NOT (id(t) IN {decisionsIds}) AND NOT t:User OR t:Decision
OPTIONAL MATCH (t)-[r2:VOTED_ON|:CREATED_BY|:VOTED_FOR]-(t1)
  WHERE NOT (r2 in rels)
OPTIONAL MATCH (t1)-[r3:CONTAINS]-(t2) 
DELETE t, r2, t2, r3;

更新

用你的数据库测试过,效果很好。关于你的断言,我不确定哪些是违反的。

export decisionsIds=[332,336,335,334,333,340,339,338,337,344,343,342,341] 

MATCH (d:Decision) WHERE id(d) IN {decisionsIds} 
OPTIONAL MATCH (d)-[r]-(t) 
DELETE d, r 
WITH t, collect(r) as rels 
  WHERE NOT (t:User OR t:Decision) AND NOT (id(t) IN {decisionsIds})
OPTIONAL MATCH (t)-[r2:VOTED_ON|:CREATED_BY|:VOTED_FOR|:CONTAINS]-(t1)
  WHERE NOT (r2 in rels)
DELETE t, r2
WITH t1
OPTIONAL MATCH (t1)-[:CONTAINS]-(t2) 
// will be detach delete in 2.3
FOREACH ( p IN (t2)--() | DELETE head(rels(p)))
DELETE t2;

+-------------------+
| No data returned. |
+-------------------+
Nodes deleted: 362
Relationships deleted: 723
340 ms

你可以像这样找到你的违规节点:

neo4j-sh (?)$ match (n)-[r]-() where id(n) = 86715 return labels(n),n,r;
+----------------------------------------------------------------------------------------------------------------------------------+
| labels(n)                  | n                                                                            | r                    |
+----------------------------------------------------------------------------------------------------------------------------------+
| ["VoteGroup","_VoteGroup"] | Node[86715]{createDate:"1443124989049",avgVotesWeight:5.0,totalVotesCount:1} | :CONTAINS[173172]{}  |
| ["VoteGroup","_VoteGroup"] | Node[86715]{createDate:"1443124989049",avgVotesWeight:5.0,totalVotesCount:1} | :VOTED_ON[173169]{}  |
| ["VoteGroup","_VoteGroup"] | Node[86715]{createDate:"1443124989049",avgVotesWeight:5.0,totalVotesCount:1} | :VOTED_FOR[173170]{} |
+----------------------------------------------------------------------------------------------------------------------------------+

如果您想查看所有被此查询触摸/将被删除的数据,请使用:

MATCH (d:Decision) WHERE id(d) IN {decisionsIds} 
OPTIONAL MATCH (d)-[r]-(t) 
WITH t, collect(r) as rels 
  WHERE NOT (t:User OR t:Decision) AND NOT (id(t) IN {decisionsIds})
OPTIONAL MATCH (t)-[r2:VOTED_ON|:CREATED_BY|:VOTED_FOR|:CONTAINS]-(t1)
  WHERE NOT (r2 in rels)
OPTIONAL MATCH (t1)-[:CONTAINS]-(t2)
RETURN *;

然后您可以在结果中找到您的违规节点,并确保您删除了它们周围的所有内容(每个 rel 类型)。

【讨论】:

  • 谢谢迈克尔,我已将示例数据库添加到我的问题正文中
  • 我已经检查了您的查询.. 它有效,但我在测试中的断言失败。它还会删除其他内容。
  • Michael,你能看看 db 吗?
  • 不确定你的断言是什么。
  • 有哪些合理的 id 可以使用?
【解决方案2】:

怎么样:

MATCH (u:User {id:"Alex"})
MATCH (u)-[r:CREATED_BY]->(n)
OPTIONAL MATCH path = (n)<-[:VOTED_FOR|:VOTED_ON|:CONTAINS]-()
DELETE n,r,path

【讨论】:

  • 谢谢,但我认为它不会起作用,因为这个模式中的不同节点(在上图中)可以由不同的Users 创建,所以我们需要从{decisionsIds} 开始查询。此外,这些用户可以根据需要创建任意数量的不同决策树,但我只需要删除 {decisionsIds} 中的特定决策树
  • 您上一个答案中的查询(不在此)非常接近我所需要的,只是此查询不会删除 Vote 节点。 Vote 节点也必须与VoteGroup 节点一起删除
猜你喜欢
  • 2012-09-06
  • 2014-01-14
  • 2021-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-10
  • 1970-01-01
相关资源
最近更新 更多