Neo4j 密码查询以查找具有某些关系但不具有其他关系的节点

Neo4j 密码查询以查找具有某些关系但不具有其他关系的节点,neo4j,cypher,Neo4j,Cypher,类似于,但不同到目前为止足以让我难堪 如果一个人符合语言要求,并且与任务没有关系(例如,完成或拒绝),那么他有资格完成任务 任务可以相互依赖,并通过0或更多的依赖于rels和'root'任务的要求来“继承”其语言 我正在尝试创建一个查询,该查询将发现 p1符合t2和t4 p2适用于所有4个 p3不符合任何 我甚至不担心t1的完蛋,我认为我还没有通过语言“继承” 例如,对于p2: MATCH(p:Person{name:'p2'})-[:SPEAKS]->(lang) 使用p,将(lang)

类似于,但不同到目前为止足以让我难堪

如果一个人符合语言要求,并且与任务没有关系(例如,完成或拒绝),那么他有资格完成任务

任务可以相互依赖,并通过0或更多的
依赖于
rels和'root'任务的
要求
来“继承”其语言

我正在尝试创建一个查询,该查询将发现

  • p1
    符合
    t2
    t4
  • p2
    适用于所有4个
  • p3
    不符合任何
我甚至不担心t1的完蛋,我认为我还没有通过语言“继承”

例如,对于
p2

MATCH(p:Person{name:'p2'})-[:SPEAKS]->(lang)
使用p,将(lang)收集为langs
匹配(t:Task)-[:依赖于*0]->(:Task)-[:REQUIRES]->(lang:Language)
朗在哪里
返回t

查找0行

MATCH(p:Person{name:'p2'})-[:SPEAKS]->(lang)
回廊

获取两种语言,因此我(相当?)确信
collect(lang)as langs
是我想要的

删除
:取决于*
链接

MATCH(p:Person{name:'p2'})-[:SPEAKS]->(lang)
使用p,将(lang)收集为langs
匹配(t:Task)-[:REQUIRES]->(lang:Language)
朗在哪里
返回t

获取我的
t1
t2
t3

我怎样才能获得t4


蒂亚

您可以更灵活地遍历路径。通过共享语言节点查找从人员到任务的路径是一种路径模式,即使路径的不同实例可以通过不同的语言进行路由。然后可以使用0+可变长度路径对其进行扩展,以查找依赖于给定任务的任务。最后,过滤掉任务与使用其中一个无效任务的人相关的任何路径。关系

MATCH (p:Person) - [:SPEAKS] -> (:Language) <- [:REQUIRES] - (:Task) <- [:DEPENDS_ON*0..] - (t:Task)
WHERE NOT (t) <- [:IS_DOING|:REJECTED] - (p)
RETURN p, COLLECT(DISTINCT t)

MATCH(p:Person)-[:SPEAKS]->(:Language)您可以更灵活地遍历路径。通过共享语言节点查找从人员到任务的路径是一种路径模式,即使路径的不同实例可以通过不同的语言进行路由。然后可以使用0+可变长度路径对其进行扩展,以查找依赖于给定任务的任务。最后,过滤掉任务与使用其中一个无效任务的人相关的任何路径。关系

MATCH (p:Person) - [:SPEAKS] -> (:Language) <- [:REQUIRES] - (:Task) <- [:DEPENDS_ON*0..] - (t:Task)
WHERE NOT (t) <- [:IS_DOING|:REJECTED] - (p)
RETURN p, COLLECT(DISTINCT t)
MATCH(p:Person)-[:SPEAKS]->(:语言)