基于节点属性的Cypher查询

时间:2018-06-06 06:20:58

标签: neo4j cypher

为了自学neo4j,我在游戏中模拟了一些行为。

我用架构创建了一个neo4j数据库: My database schema

所以平台拥有具有模式的设备。在游戏中,平台可以在具有共同模式时进行交互。游戏中的任何对象都会受到时间事件的影响,这使得它们无法正常运行。在图数据库中,这些事件被建模为事件,这可能会影响一个或多个节点。

我创建了一个查询,通过这个查询,我可以询问网络在{year}年中的样子,通过说明返回与事件没有关联的所有节点:< / p>

MATCH (any)
OPTIONAL MATCH (any)--(event:Event) 
WHERE event.year < 2031
WITH any, event
WHERE event IS NULL AND NOT "Event" in LABELS(any)
MATCH(any)
OPTIONAL MATCH (any)<-[:PARTIAL]-(e:Event)
RETURN any, e

这给了我一个图表,它代表了我在2030年建模的网络&#39;。 Here is the graph before any events (year=2000) Here is the graph after the first event (year=2031)

我想问一下上述查询返回的子图的其他问题,例如“平台在给定年份可以访问多少种模式?”#39;。我尝试调整上述查询:

MATCH (p:Platform),(e:Equipment),(m:Mode)
OPTIONAL MATCH (p)--(event:Event), (e)--(event), (m)--(event) 
WHERE event.year < 2031
WITH p,e,m, event 
WHERE event IS NULL 
MATCH(p),(e),(m) 
RETURN p, e, m

但是这并没有让我更接近我想要的地方,因为它会返回所有内容。

假设我没有尝试做一些内在疯狂的事情(我很难找到好的资源来学习如何进行类似的查询),我怎么能弯曲密码来获取信息。我为清楚而道歉 - 我对该域名不太熟悉,无法使用正确的术语来解决我的问题。我发现的最接近的描述是&#34;提取子图,其中该子图中的任何节点都与具有特定属性的特定类型的节点有关系&#34;

任何帮助表示赞赏!

修改: 经过一段时间的游戏,我想出了(我怀疑是一种非常无效的方式)返回所有没有事件的设备,或者在某一年之后发生的事件:

MATCH (e:Equipment)--(ev:Event)
WHERE ev.year > {year}
RETURN e
UNION 
MATCH (e:Equipment)
WHERE NOT (e)<--(:Event)
RETURN e

I also found this stack post that helped me, but I'm not sure if it can get me all of the way

2 个答案:

答案 0 :(得分:0)

此查询可能会执行您想要的操作。

MATCH (p:Platform)
OPTIONAL MATCH (event:Event)--(p)
WHERE event.year < 2031
OPTIONAL MATCH (e:Equipment)--(event)
OPTIONAL MATCH (m:Mode)--(event) 
RETURN p, COLLECT(event) AS events, COLLECT(e) AS es, COLLECT(m) AS ms

对于每个Platform节点,它会查找:

  • 可选的相关Event个节点year&lt; 2031。
  • 与上述Equipment节点相关的可选Event个节点。
  • 与上述Mode节点相关的可选Event个节点。

并为每个Platform节点返回其相关事件,设备和模式的集合。

答案 1 :(得分:0)

多个小时头部刮伤,我有办法可行。我意识到它可能是一个糟糕的解决方案......

OPTIONAL MATCH (e:Equipment)--(ev:Event)
WHERE ev.year > {year}
WITH collect(e) as validE
MATCH (e:Equipment)
WHERE NOT (e)<--(:Event)
WITH (validE+collect(e)) as validE
UNWIND validE as e
WITH e
OPTIONAL MATCH (m:Mode)--(ev:Event)
WHERE ev.year > {year}
WITH e, collect(m) as validM
MATCH (m:Mode)
WHERE NOT (m)<--(:Event)
WITH e, (collect(m)+validM) as validM2
UNWIND validM2 as m
WITH m, e
MATCH (p:Platform)--(e)--(m)
RETURN p.name, count(m)

工作原理:

  • 收集与节点equipment无关系的events,其属性year小于我们感兴趣的年份
  • 放开 equipment并使用它来查找相关modes,再次检查年度有效性。
  • 最后,收集了我们感兴趣的modesequipments匹配 platforms

注意:

  • 在我的例子中,Optional匹配很重要,因为对于感兴趣的年份,可能没有更多的未来&#39;事件。这将导致查询不返回任何结果。

我希望这可以帮助将来的某个人 - 任何有助于使这个稍微更优/更友好的帮助都会有用!