我正在尝试使用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)关系.
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)
它将检查节点没有任何传入/传出关系.
如果您需要"条件排除"语义,您可以通过这种方式实现它.
从neo4j 2.2.1开始,您可以使用OPTIONAL MATCH
子句并过滤掉不匹配的(NULL
)节点.
WITH
在OPTIONAL MATCH
和子句之间使用子句也很重要WHERE
,因此第一个WHERE
定义了可选匹配的条件,第二个WHERE
行为类似于过滤器.
假设我们有两种类型的节点:Person
和Communication
.如果我想让所有从未通过电话沟通但可能已经通过其他方式传达的人员,我会提出以下问题:
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)
匹配模式将匹配所有人与他们的通信,其中c
将NULL
用于非电话通信.然后过滤器(WHERE
之后WITH
)将过滤掉所有其他电话通信.
参考文献:
http://neo4j.com/docs/stable/query-optional-match.html#_introduction_3 http://java.dzone.com/articles/new-neo4j-optional
归档时间: |
|
查看次数: |
65341 次 |
最近记录: |