首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Neo4j Cypher查询与复合对象

Neo4j Cypher查询与复合对象
EN

Stack Overflow用户
提问于 2017-07-08 16:44:10
回答 1查看 218关注 0票数 2

我有一个下面的Cypher查询,它返回属于特定Tag的所有Tag

代码语言:javascript
复制
MATCH (d:Decision)-[:BELONGS_TO]->(t:Tag) WHERE t.id = {tagId} RETURN d

根据我的业务逻辑,每个Tag都可以有一组同义词:

代码语言:javascript
复制
(t:Tag)<-[:FOR]-(ts:TagSynonym)-[:HAS]->(s:Tag) 

而且每个s:Tag也可以有一个同义词以同样的方式关联。无限的深度和位置ts.approved = true

请演示如何扩展第一个查询,以便不仅返回与开始标记(t.id = {tagId})相关的决策,而且返回与所有标记的同义词相关的所有决策(深度无限)。

理想情况下,所有这些决策都应该在一个d变量下返回。

现在,我正在处理以下查询:

代码语言:javascript
复制
MATCH p=(t:Tag)-[:FOR|HAS*]-(end:Tag) 
WHERE t.id = {tagId} AND NOT (end)<-[:FOR]-() 
OPTIONAL MATCH (d:Decision)-[:BELONGS_TO]->(tag) 
RETURN d

但不起作用。

更新

我创建了一个Neo4j沙箱:

代码语言:javascript
复制
http://54.165.53.29:33761/browser/
neo4j
timer-rocks-hilltop

请使用以下查询:

代码语言:javascript
复制
MATCH p=(t:Tag)-[:FOR|HAS*0..]-(end:Tag) 
WHERE t.id = 1 AND NOT (end)<-[:FOR]-() 
MATCH (d:Decision)-[:BELONGS_TO]->(end) 
RETURN d

它只返回路径中的最后一个决定(Decision3),但也应该返回Decision1和决定2。

这是样本数据库用户名/密码:新4j/新4j1

我有一个与这个标记相关联的3 Tag和3 Decision

也是

Tag 2Tag 1的同义词,Tag 3Tag 2的同义词。

我需要找到所有的Decision通过Tag 1和它的同义词(Tag 2Tag 3)。这是决定:Decision1Decision2Decision 3

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-08 20:27:49

对于可变的深度遍历,有一件微妙的事情,即零深度:

代码语言:javascript
复制
MATCH p=(t:Tag)-[:FOR|HAS*0..]-(end:Tag) 
WHERE t.id = {tagId} AND NOT (end)<-[:FOR]-() 
MATCH (d:Decision)-[:BELONGS_TO]->(end) 
RETURN d

其思想是,它既处理t节点具有FOR或关系的情况,也处理它们没有关系的情况。诀窍是找到的标记(即使t节点也是0)都在end别名下。

您可以在本文中找到关于可变长度关系的更深入的文档:https://graphaware.com/graphaware/2015/05/19/neo4j-cypher-variable-length-relationships-by-example.html

编辑

似乎查找标记节点的逻辑是错误的,由于查询AND NOT (end)<-[:FOR]-()中的这个部分,查询只返回一个标记。移除它,你会看到它返回3个决定

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44988499

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档