Architecture Neo4j实施意见

Architecture Neo4j实施意见,architecture,neo4j,cypher,Architecture,Neo4j,Cypher,在我的Spring Boot/Neo4j应用程序中,我有一棵很大的Neo4j节点树,现在我想为每个节点实现分层注释 现在我在想这些评论应该放在哪里。。。在Neo4j数据库或其他一些外部RDBMS/NoSQL存储中 为什么我会这么想?因为我目前对密码的了解有限,我面临着移除沉重的Neo4j节点(与其他节点有许多关系的复合节点)的问题。。我现在无法解决这个问题。。因此,引入新的注释节点可以完全杀死我的系统 那么,您认为我应该尝试修复删除问题还是在一些外部数据存储中实现注释 已更新 这是我的慢速删除查

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

现在我在想这些评论应该放在哪里。。。在Neo4j数据库或其他一些外部RDBMS/NoSQL存储中

为什么我会这么想?因为我目前对密码的了解有限,我面临着移除沉重的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
匹配(d:决策)
其中,{decisionsIds}中的id(d)
可选匹配(d)-[r]-(t)
删除d,r
带t,r,其中不是(id(t)在{decisionsIds})
可选匹配(t)-[r2:在|上投票:由|创建:投票给]-()-[r3:包含]-(t2),其中r2 r
有t,r2,t2,r3
其中无(x在标签(t)中)
其中x在[‘用户’、‘决策’]中)
删除t、r2、t2、r3
现在这个查询工作很长时间,所以我害怕向决策节点添加新的实体,以免完全破坏性能


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

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

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

更新 用你的数据库测试,效果很好。关于你的主张,我不确定哪些主张被违反了

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类型)。

如何:

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

可选匹配路径=(n)也许可以提供到目前为止所做工作的更多详细信息?你的描述很模糊。一般来说,处理注释树对Neo4j来说不是问题。我已经添加了删除查询。此查询工作时间很长,因此我担心现在会将新实体添加到决策节点。如果您也可以共享配置文件或示例数据库以对其进行测试,那就太好了。您使用的是哪个版本?Neo4j 2.2.5 SDN 3.4.0.RELEASE。我现在要创建一个示例数据库谢谢Michael,我已经将示例数据库添加到我的问题正文中我已经检查了您的查询。。它可以工作,但我在测试中的断言失败了。它还删除了一些其他内容。Michael,你能看一下db吗?不确定你的断言是什么。使用什么合理的id?谢谢,但我认为它不会起作用,因为这个模式中的不同节点(在上图中)可以由不同的
用户创建
,所以我们需要从
{decisionsIds}开始查询
。此外,这些用户可以创建任意多个不同的决策树,但我只需要删除
{decisionsIds}
中的特定决策树。在您之前的回答中,查询(不在此)与我所需的非常接近,只是此查询不删除
投票
节点<代码>投票
节点也必须与
投票组
节点一起删除
MATCH (u:User {id:"Alex"})
MATCH (u)-[r:CREATED_BY]->(n)
OPTIONAL MATCH path = (n)<-[:VOTED_FOR|:VOTED_ON|:CONTAINS]-()
DELETE n,r,path