如果不存在关系,则返回节点

Nic*_*las 82 neo4j cypher

我正在尝试使用cypher创建一个查询,它将"找到"厨师可能缺少的成分,我的图形设置如下:

(ingredient_value)-[:is_part_of]->(ingredient)
Run Code Online (Sandbox Code Playgroud)

(ingredient)将具有name ="染料颜色"的键/值. (ingredient_value)可以有一个键值/值="红色"和"是"的一部分(ingredient, name="dye colors").

(chef)-[:has_value]->(ingredient_value)<-[:requires_value]-(recipe)-[:requires_ingredient]->(ingredient)
Run Code Online (Sandbox Code Playgroud)

我正在使用这个查询获得ingredients食谱所需的所有,但不是它们的实际值,但我希望只返回ingredients厨师没有的,而不是每个食谱所需的所有成分.我试过了

(chef)-[:has_value]->(ingredient_value)<-[:requires_value]-(recipe)-[:requires_ingredient]->(ingredient)<-[:has_ingredient*0..0]-chef
Run Code Online (Sandbox Code Playgroud)

但这没有任何回报.

这是可以通过cypher/neo4j实现的东西,还是通过返回所有成分并通过它们自行分类来最好地处理这个问题?

额外奖励:还有一种方法可以使用cypher来匹配厨师拥有的所有值以及食谱所需的所有值.到目前为止,我只返回了a返回的所有部分匹配,chef-[:has_value]->ingredient_value<-[:requires_value]-recipe并自己聚合结果.

Gil*_*tal 147

更新01/10/2013:

在Neo4j 2.0中引用了这个:

尽量不要使用可选关系.首先,

不要像这样使用它们:

MATCH a-[r?:LOVES]->() WHERE r IS NULL 你只需要确保它们不存在.

而是这样做:

MATCH a WHERE NOT (a)-[:LOVES]->()
Run Code Online (Sandbox Code Playgroud)

使用cypher检查关系是否不存在:

...
MATCH source-[r?:someType]-target
WHERE r is null
RETURN source
Run Code Online (Sandbox Code Playgroud)

的?mark使关系成为可选的.

要么

在neo4j 2中:

...
OPTIONAL MATCH source-[r:someType]-target
WHERE r is null
RETURN source
Run Code Online (Sandbox Code Playgroud)

现在您可以检查不存在的(null)关系.

  • `MATCH a ...`示例现在应该是`MATCH(a)WHERE NOT(a) - [:LOVES] - >()` (4认同)
  • 在Neo4j 2.0中,使用OPTIONAL MATCH匹配可选关系,即第一个示例看起来像OPTIONAL MATCH(source) - [r:someType] - (target)RETURN source,r (3认同)

Sat*_*nde 15

用于获取没有任何关系的节点

这是检查关系是否存在的好选择

MATCH (player)-[r:played]->()
    WHERE r IS NULL 
    RETURN player
Run Code Online (Sandbox Code Playgroud)

您还可以为此检查多个条件它将返回所有节点,这些节点没有"播放"或"未播放"关系.

MATCH (player) 
 WHERE NOT (player)-[:played|notPlayed]->()
 RETURN player
Run Code Online (Sandbox Code Playgroud)

获取没有任何实现的节点

MATCH (player) 
WHERE NOT (player)-[r]-()
RETURN player
Run Code Online (Sandbox Code Playgroud)

它将检查节点没有任何传入/传出关系.

  • `MATCH(播放器)WHERE NOT(播放器) - [r] - ()RETURN player`给出**变量r未定义**错误.我怎么定义r? (4认同)

Die*_*ski 7

如果您需要"条件排除"语义,您可以通过这种方式实现它.

从neo4j 2.2.1开始,您可以使用OPTIONAL MATCH子句并过滤掉不匹配的(NULL)节点.

WITHOPTIONAL MATCH和子句之间使用子句也很重要WHERE,因此第一个WHERE定义了可选匹配的条件,第二个WHERE行为类似于过滤器.

假设我们有两种类型的节点:PersonCommunication.如果我想让所有从未通过电话沟通但可能已经通过其他方式传达的人员,我会提出以下问题:

MATCH (p: Person) 
OPTIONAL MATCH p--(c: Communication) 
WHERE c.way = 'telephone'
WITH p, c 
WHERE c IS NULL 
RETURN p
Run Code Online (Sandbox Code Playgroud)

匹配模式将匹配所有人与他们的通信,其中cNULL用于非电话通信.然后过滤器(WHERE之后WITH)将过滤掉所有其他电话通信.

参考文献:

http://neo4j.com/docs/stable/query-optional-match.html#_introduction_3 http://java.dzone.com/articles/new-neo4j-optional