Neo4j 查询只使用没有给定属性的关系
cypher是否有可能不使用基于属性的某些关系 我们有一个新的要求,即关系永远不应该被硬删除,但应该得到一个标志“deleted=true”,这样我们就可以对节点的关系进行审计跟踪。(有点像X是Y的朋友,但对所有关系类型来说都有点复杂) 这在密码查询中是可行的,只需使用Neo4j 查询只使用没有给定属性的关系,neo4j,cypher,Neo4j,Cypher,cypher是否有可能不使用基于属性的某些关系 我们有一个新的要求,即关系永远不应该被硬删除,但应该得到一个标志“deleted=true”,这样我们就可以对节点的关系进行审计跟踪。(有点像X是Y的朋友,但对所有关系类型来说都有点复杂) 这在密码查询中是可行的,只需使用,其中r.deleted=false,但在更复杂的查询中,遍历4-5种关系类型,这可能会变得更困难 有没有一种简单的方法可以说Neo4J不应该使用属性“deleted”设置为true的任何关系?这与您的要求不完全一样,但是您也可以
,其中r.deleted=false
,但在更复杂的查询中,遍历4-5种关系类型,这可能会变得更困难
有没有一种简单的方法可以说Neo4J不应该使用属性“deleted”设置为true的任何关系?这与您的要求不完全一样,但是您也可以将关系的类型从
SOMETHING
更改为SOMETHING\u deleted
。然后,当您指定遍历时,可以跳过这些关系。这样查询
(用户)-[:friend{deleted:'false'}]->(f)-[:works_in{deleted:'false'}
]-(公司)
事实上,随着图形模型的发展,保留一个
已删除的属性很快变得难以管理:该属性会潜入到您的每个查询中。据我所知,Neo4j没有提供任何帮助
然而,我已经成功地运用了阿尔伯特·奥普多莫的方法。一些细节是在几个月前
您希望替换要软删除的两个节点:它们的标签(因此无法直接查找)和它们的关系(因此无法从其他节点访问)。在我的例子中,我只是在标签和关系类型前面加了一个下划线(\ux)
好处很明显:您现有的查询(可能!)是安全的,因为不再考虑软删除的节点(它们无法再访问,除非您明显省略关系类型,即(a)-(b)
或其他)
我还认为这是实现软删除的最有效的方法,因为您有效地切断了图形的各个部分,而不是在属性上进行匹配(即使它已被索引)
然而,有一个陷阱。没有替换标签和关系的通用方法。例如,你不能说以下几句话:
match (:Person {id: 123})-[r]-()
set type(r) = '_' + type(r);
对于您拥有的每种类型的节点,必须分别替换每个标签和关系。如果关系是可选的,事情也会变得棘手,因为很难在整个查询中“携带”初始节点(因此)
我解决这个问题的方法是使用UNION
将查询的不同部分串在一起:
MATCH (review:Review {Id: {id}})<-[wrote:WROTE_REVIEW]-(owner)
DELETE wrote CREATE (review)<-[:_WROTE_REVIEW]-(owner)
UNION
MATCH (review:Review {Id: {id}})-[evaluates:EVALUATES]->(product)
DELETE evaluates CREATE (review)-[:_EVALUATES]->(product)
UNION
...
UNION
MATCH (review:Review {Id: {id}})
REMOVE review:Review") SET review:_Review;
MATCH(review:review{Id:{Id}})(产品)
联合
...
联合
匹配(审阅:审阅{Id:{Id}})
删除审核:审核“)设置审核:\u审核;
是的,您在每个子查询中都MATCH
ing相同的节点,但是我认为如果您的属性被索引,那么性能影响可以忽略,但主要是因为您创建/读取节点的频率比删除节点的频率要高得多(否则,您的数据库将为空!)