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,我的图形数据库中有两种节点:(规则)和(约束),还有一种关系(规则)->[:VALIDATED\u IF]->(约束),它有两个属性{id,type} 所以我的数据库看起来像这样: (rule1)-[:VALIDATED_IF{id1,type1}]->(constraint1) 我需要的是找出在关系中是否有两个不同的(规则)具有完全相同的(约束),并且具有相同的{id,type}。 我该怎么做 我试过这样的方法: MATCH (r1:Rule)-[p1:VALIDATED_IF]-&g

我的图形数据库中有两种节点:
(规则)
(约束)
,还有一种关系
(规则)->[:VALIDATED\u IF]->(约束)
,它有两个属性
{id,type}
所以我的数据库看起来像这样:

(rule1)-[:VALIDATED_IF{id1,type1}]->(constraint1)
我需要的是找出在关系中是否有两个不同的
(规则)
具有完全相同的
(约束)
,并且具有相同的
{id,type}

我该怎么做

我试过这样的方法:

MATCH (r1:Rule)-[p1:VALIDATED_IF]->(c:Constraint)<-[p2:VALIDATED_IF]-(r2:Rule)
WHERE r1.ruleName <> r2.ruleName
AND p1.id = p2.id
AND p2.type = p2.type
RETURN r1.ruleName, r2.ruleName, c.condition

MATCH(r1:Rule)-[p1:VALIDATED\u IF]->(c:Constraint)我们可以聚合每个约束的:Rule节点、rel id和rel type,当每个约束有2个以上的:Rule节点时,这也会起作用:

MATCH (rule:Rule)-[rel:VALIDATED_IF]->(c:Constraint)
WITH c, rel.id as relId, rel.type as relType, collect(rule) as rules
WHERE size(rules) > 1
RETURN c.condition as condition, [r in rules | r.ruleName] as rules
在Cypher中,当您聚合时,非聚合变量成为分组键,因此每行都有约束、rel id和rel类型,以及所有具有相同约束、rel id和rel类型的规则

编辑

好的,听起来您想要获取共享相同约束集合的规则集合。这对你有用吗

MATCH (rule:Rule)-[rel:VALIDATED_IF]->(c:Constraint)
WITH rule, rel.id as relId, rel.type as relType, c
ORDER BY id(c)
WITH rule, relId, relType, collect(c) as constraints
WITH constraints, collect(rule) as rules
WHERE size(rules) > 1
RETURN [c in constraints | c.condition] as conditions, [r in rules | r.ruleName] as rules

好的,我通过改进解决了这个问题:

匹配(r1:规则)-[v1:已验证的\u IF]->(:约束)(c1:约束),
(r2)-[:已验证的_IF]->(c2:约束)
具有
r1,r2,
计数(不同的c1)为c1Count,计数(不同的c2)为c2Count

MATCH(r1)-(v1:VALIDATED_IF]->(c:Constraint)到底是什么
,但给我提供了具有相同约束之一的规则
?这意味着它返回具有一个共同约束的规则,而不是所有约束都不完全是我想要的,它返回与每个约束相关的所有规则。我需要的是与完全相同的约束组相关的所有规则
MATCH (r1:Rule)-[v1:VALIDATED_IF]->(:Constraint)<-[v2:VALIDATED_IF]-(r2:Rule)
WHERE
     v1.id=v2.id AND v1.type = v2.type
MATCH
    (r1)-[:VALIDATED_IF]->(c1:Constraint),
    (r2)-[:VALIDATED_IF]->(c2:Constraint)
WITH
     r1, r2,
     COUNT(DISTINCT c1) AS c1Count, COUNT(DISTINCT c2) AS c2Count
MATCH (r1)-[v1:VALIDATED_IF]->(c:Constraint)<-[v2:VALIDATED_IF]-(r2)
WITH
     r1, r2,
     c1Count, c2Count, COUNT(c) AS commonConstraintsCount, 
     COLLECT(c.condition) AS cond // (5)\n" + 
WHERE
     ID(r1) < ID(r2) AND
     commonConstraintsCount = c1Count AND
     commonConstraintsCount = c2Count AND
     c1Count = c2Count
     RETURN r1.ruleName, r2.ruleName, cond
     ORDER BY r1.ruleName, r2.ruleName