【问题标题】:Neo4j Properties on relationshipNeo4j 关系属性
【发布时间】:2013-10-14 11:52:12
【问题描述】:

假设我有两个节点 "Body Temperature" 和 "Fever" ,它们之间的关系具有名称 "causes" 和属性为 "degree Celsius" 的值为 "102.0" 。现在我要做的是编写一个密码查询,其中如果 MATCH 子句中的属性值 > 102.0 则它必须检索发烧节点,否则不会。

除了创建这样的结构之外,我不知道如何编写这样的查询。

任何帮助将不胜感激。

【问题讨论】:

  • 您使用的是哪个版本的 Neo4j?
  • 我使用的是 1.9 版
  • 102摄氏度高于水的沸点,肯定会让你发烧:P

标签: neo4j cypher graph-databases


【解决方案1】:

WHERE 子句中,您可以像过滤节点属性一样过滤关系属性。只需确保将关系绑定到 MATCH 子句中的标识符即可。我不明白你的模型(温度是因果关系的属性吗?)但你可以尝试类似

MATCH (body_temperature) <-[r:CAUSES]- (fever)
WHERE r.degreeCelsius > 102

这就是你要找的吗?

编辑

要使CREATE 子句依赖于某些条件,您可以将您的条件声明为仅匹配您想要创建某些内容的情况的模式,然后继续创建。只需确保在STARTMATCHWHERE 子句中绑定要在CREATE 子句中使用的不同节点或关系。有时您可能必须使用 WITH 将结果带到查询的新部分,但对于您的情况,请先尝试类似

START bodyTemp = node:MyIndex(name="Body Temperature"), fever = node:MyIndex(name="Fever")
WHERE HAS(bodyTemp.degreeCelsius) AND bodyTemp.degreeCelsius > 102.0
CREATE bodyTemp -[:CAUSES]-> FEVER

【讨论】:

  • 当且仅当摄氏度大于 102.0 时,此查询是否会创建体温和发烧之间的关系?
  • 不,这匹配图表中已有的模式,过滤关系属性。如果“体温”节点的“摄氏度”属性值超过 102.0,是否要创建关系?
  • 是的,我只想这样做。对不起,如果我没有把我的问题写清楚。
【解决方案2】:

假设“摄氏度”是关系“原因”的属性,可以使用“where”子句来指定属性值约束,如下所示,

Match t:BodyTemperature-[r:CAUSES]->f:Fever
Where r.degreeCelsius > 102.0
Return f

【讨论】:

  • 似乎我在其他人已经回答后一分钟才继续发帖:) 我会退出并删除我的答案,除非我认为您可能假设正在使用 Neo4j 2.0,对吗?
  • 无需删除您的答案。我认为有多个答案没有任何害处。它经常发生,是的,标签的使用需要 2.0。
  • 当且仅当摄氏度大于 102.0 时,此查询是否会创建体温和发烧之间的关系?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多