Neo4j Cypher:如何从路径中解压节点以允许进一步匹配?

Neo4j Cypher:如何从路径中解压节点以允许进一步匹配?,neo4j,cypher,Neo4j,Cypher,这个问题是这个问题的后续问题 我有一个有循环链表的图表。()链表中的每个节点都指向一个用户。当查询列表时,我必须使用path语句,因为列表是循环的,我不想检索从u:USER节点开始的节点。为了获得感兴趣的节点,我的查询如下所示: MATCH path=(nl:NODELINK { linkId:'cc' })-[:LINK*]->(u:USER) RETURN nodes(path) 检索到路径后,我希望进一步匹配该路径中的节点(节点链接),如下所示: MATCH path=(nl:NO

这个问题是这个问题的后续问题

我有一个有循环链表的图表。()链表中的每个节点都指向一个用户。当查询列表时,我必须使用path语句,因为列表是循环的,我不想检索从u:USER节点开始的节点。为了获得感兴趣的节点,我的查询如下所示:

MATCH path=(nl:NODELINK { linkId:'cc' })-[:LINK*]->(u:USER)
RETURN nodes(path)
检索到路径后,我希望进一步匹配该路径中的节点(节点链接),如下所示:

MATCH path=(nl:NODELINK { linkId:'cc' })-[:LINK*]->(u:USER)
WITH nodes(path) AS nodeLinks
MATCH nodeLinks-[:PERSONLINK]->persons
RETURN persons
但如果我尝试,我会得到一个错误:

Error: Type mismatch: nodeLinks already defined with conflicting type Collection<Node> (expected Node) (line 3, column 7)
"MATCH nodeLinks-[:PERSONLINK]->persons"
错误:类型不匹配:已使用冲突的类型集合(预期节点)定义节点链接(第3行第7列)
“匹配节点链接-[:PERSONLINK]->个人”

如何从路径中解包NODELINK类型的节点,以便对它们进行进一步的匹配查询?

试试这个。。。有点骇客,但除非有一个放松的操作,它将工作

MATCH path=(nl:NODELINK { linkId:'cc' })-[:LINK*]->(u:USER)
WITH [x in nodes(path) | id(x)] AS nodeLinkIds
MATCH (n1:NODELINK)
WHERE id(n1) in nodeLinkIds // this does efficient id lookups for the nodes in the list
MATCH n1-[:PERSONLINK]->persons
RETURN persons

另一个选项是将所需的节点作为行而不是集合返回,然后进一步匹配节点的行。 要将节点作为行返回,首先指定路径上的节点,然后计算从节点到节点用户的距离:NODELINK,如果距离大于从起始节点(例如“cc”)到最终用户节点的距离,则应将其从结果中排除

MATCH path=(:NODELINK { linkId:'cc' })-[:LINK*]->(:USER)
WITH length(path) AS longest
MATCH p=(:NODELINK { linkId:'cc' })-[:LINK*]->(nodeLinks:NODELINK), p1 =(nodeLinks)-[:LINK*]->(:USER)
WITH nodeLinks, length(p1) AS n2u, longest
WHERE n2u <= longest
WITH nodeLinks
MATCH nodeLinks-[:PERSONLINK]->persons
RETURN persons
匹配路径=(:NODELINK{linkId:'cc'})-[:LINK*]->(:USER)
长度(路径)为最长
匹配p=(:NODELINK{linkId:'cc'})-[:LINK*]->(nodeLinks:NODELINK),p1=(nodeLinks)-[:LINK*]->(:USER)
对于节点线,长度(p1)为n2u,最长
n2u人员在哪里
返回人员

查看控制台的结果,

现在有一个
解卷
操作员,因此这应该可以工作:

MATCH path=(nl:NODELINK { linkId:'cc' })-[:LINK*]->(u:USER)
WITH nodes(path) AS x UNWIND x AS nodeLinks
MATCH nodeLinks-[:PERSONLINK]->persons
RETURN persons

我本以为我们可以将展开节点(路径)作为节点链接来执行
,但这在Neo4j 2.2.0-M03中给了我一个神秘的
转换=''''
错误。

你能提供一个更具体的例子吗?你想用你的数据回答什么样的问题?我认为答案是,您可能需要以不同的方式对数据进行建模,以反映您试图提出的问题的答案。您知道提供放松操作的任何计划吗?看起来更好,我会查看它