Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Neo4j 查询只使用没有给定属性的关系_Neo4j_Cypher - Fatal编程技术网

Neo4j 查询只使用没有给定属性的关系

Neo4j 查询只使用没有给定属性的关系,neo4j,cypher,Neo4j,Cypher,cypher是否有可能不使用基于属性的某些关系 我们有一个新的要求,即关系永远不应该被硬删除,但应该得到一个标志“deleted=true”,这样我们就可以对节点的关系进行审计跟踪。(有点像X是Y的朋友,但对所有关系类型来说都有点复杂) 这在密码查询中是可行的,只需使用,其中r.deleted=false,但在更复杂的查询中,遍历4-5种关系类型,这可能会变得更困难 有没有一种简单的方法可以说Neo4J不应该使用属性“deleted”设置为true的任何关系?这与您的要求不完全一样,但是您也可以

cypher是否有可能不使用基于属性的某些关系

我们有一个新的要求,即关系永远不应该被硬删除,但应该得到一个标志“deleted=true”,这样我们就可以对节点的关系进行审计跟踪。(有点像X是Y的朋友,但对所有关系类型来说都有点复杂)

这在密码查询中是可行的,只需使用
,其中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相同的节点,但是我认为如果您的属性被索引,那么性能影响可以忽略,但主要是因为您创建/读取节点的频率比删除节点的频率要高得多(否则,您的数据库将为空!)