Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Neo4j Cypher能否基于给定类型的第一个遇到的节点的属性筛选结果?_Neo4j_Cypher_Graph Databases_Nosql - Fatal编程技术网

Neo4j Cypher能否基于给定类型的第一个遇到的节点的属性筛选结果?

Neo4j Cypher能否基于给定类型的第一个遇到的节点的属性筛选结果?,neo4j,cypher,graph-databases,nosql,Neo4j,Cypher,Graph Databases,Nosql,我正在使用Neo4J和学习Cypher,并且对基于给定类型的第一个遇到的节点的属性(在下面示例代码的可选匹配行中)过滤结果有疑问 我的质询如下: MATCH (a:Word), (b:Word) WHERE a.lemma IN [ "enjoy" ] AND b.lemma IN [ "control", "achievement" ] OPTIONAL MATCH p = shortestPath((a)-[:IS_DEFINED_AS|IS_A_FORM_OF*..15]-

我正在使用Neo4J和学习Cypher,并且对基于给定类型的第一个遇到的节点的属性(在下面示例代码的
可选匹配
行中)过滤结果有疑问

我的质询如下:

MATCH 
  (a:Word), 
  (b:Word)
WHERE a.lemma IN [ "enjoy" ]
  AND b.lemma IN [ "control", "achievement" ]
OPTIONAL MATCH p = shortestPath((a)-[:IS_DEFINED_AS|IS_A_FORM_OF*..15]-(b)) 
RETURN 
  a.lemma as From, b.lemma as To,
  length(
    filter(n in nodes(p) WHERE 'Word' in labels(n))
  ) - 1 as Shortest_Number_of_Hops_Only_Counting_Words, 
  length(p) as Shortest_Number_of_Hops_Counting_All_Nodes
数据库中可能会出现两种一般类型的路径:

(a:Word) <-[IS_A_FORM_OF]- (Morph) -[IS_A_FORM_OF]-> (Word) -[IS_DEFINED_AS]-> (Synset) <-[IS_DEFINED_AS]- (Word) -[IS_DEFINED_AS]-> (Synset) <-[IS_DEFINED_AS]- (b:Word)

(a:Word)(Word)-[u_定义为]->(Synset)(Synset)(Synset)(Synset)您可以通过如下属性匹配Synset节点

MATCH (verb:Synset {part_of_speech: 'verb'})
RETURN verb
然后变量
verb
将只匹配其
词性部分
属性为
“verb”
的语法集节点

您可以在请求中进一步使用此变量。例如,您可以编写基本相同的请求,限制
中节点属性的值,其中
部分:

MATCH (verb:Synset)
WHERE verb.part_of_speech = 'verb'
RETURN verb
应用于您的请求,您可能会将其改写为:

MATCH 
  (a:Word) -[:IS_DEFINED_AS]-> (verb:Synset {part_of_speech: "verb"}), 
  (b:Word)
WHERE a.lemma IN [ "enjoy" ]
  AND b.lemma IN [ "control", "achievement" ]
OPTIONAL MATCH p = shortestPath((a)-[:IS_DEFINED_AS]-(verb)-[:IS_DEFINED_AS|IS_A_FORM_OF*..15]-(b)) 
RETURN 
  a.lemma as From, b.lemma as To,
  length(
    filter(n in nodes(p) WHERE 'Word' in labels(n))
  ) - 1 as Shortest_Number_of_Hops_Only_Counting_Words, 
  length(p) as Shortest_Number_of_Hops_Counting_All_Nodes

您可以通过其属性匹配Synset节点,如下所示

MATCH (verb:Synset {part_of_speech: 'verb'})
RETURN verb
然后变量
verb
将只匹配其
词性部分
属性为
“verb”
的语法集节点

您可以在请求中进一步使用此变量。例如,您可以编写基本相同的请求,限制
中节点属性的值,其中
部分:

MATCH (verb:Synset)
WHERE verb.part_of_speech = 'verb'
RETURN verb
应用于您的请求,您可能会将其改写为:

MATCH 
  (a:Word) -[:IS_DEFINED_AS]-> (verb:Synset {part_of_speech: "verb"}), 
  (b:Word)
WHERE a.lemma IN [ "enjoy" ]
  AND b.lemma IN [ "control", "achievement" ]
OPTIONAL MATCH p = shortestPath((a)-[:IS_DEFINED_AS]-(verb)-[:IS_DEFINED_AS|IS_A_FORM_OF*..15]-(b)) 
RETURN 
  a.lemma as From, b.lemma as To,
  length(
    filter(n in nodes(p) WHERE 'Word' in labels(n))
  ) - 1 as Shortest_Number_of_Hops_Only_Counting_Words, 
  length(p) as Shortest_Number_of_Hops_Counting_All_Nodes
@oleg kurbatov的答案确实有效,但前提是(a:Word)立即连接到一个语法集(它不考虑(a:Word)在到达语法集之前必须通过Morph类型的节点等的情况(如我在原始问题中的第一个示例路径)。此外,将路径添加到一起的方法似乎计算量更大–对于我的原始查询,是802ms,而使用Oleg建议实现的稍微修改版本,则是2364ms(因为在使用
shortestPath()
时,Cypher/Neo4J不允许指定多个特定跃点):

不过,以Oleg的建议为起点,我确实找到了一种过滤
shortestPath()
的方法,这样它只会停留在第一个遇到的Synset节点具有“pos”属性“v”的路径上,而不会增加查询执行时间:我将原始问题中的
可选匹配
行修改为:

OPTIONAL MATCH p = shortestPath((a)-[:IS_DEFINED_AS|IS_A_FORM_OF*..15]-(b))
WHERE head(filter(x in nodes(p) WHERE x:Synset)).pos = 'v'
据我所知,
filter(nodes(p)中的x,其中x:Synset)
获取正在考虑的路径中所有Synset类型节点的列表。
head(…)
从该列表中获取第一个节点,并且
.pos='v'
检查该节点的“pos”属性是否为“v”。

@oleg kurbatov的答案确实有效,但前提是(a:Word)立即连接到一个Synset(它不考虑(a:Word)在到达Synset之前必须经过Morph类型的节点等的情况(如我在原始问题中的第一个示例路径)。此外,将路径添加到一起的方法似乎计算量更大–对于我的原始查询,是802ms,而使用Oleg建议实现的稍微修改版本,则是2364ms(因为在使用
shortestPath()
时,Cypher/Neo4J不允许指定多个特定跃点):

不过,以Oleg的建议为起点,我确实找到了一种过滤
shortestPath()
的方法,这样它只会停留在第一个遇到的Synset节点具有“pos”属性“v”的路径上,而不会增加查询执行时间:我将原始问题中的
可选匹配
行修改为:

OPTIONAL MATCH p = shortestPath((a)-[:IS_DEFINED_AS|IS_A_FORM_OF*..15]-(b))
WHERE head(filter(x in nodes(p) WHERE x:Synset)).pos = 'v'

据我所知,
filter(nodes(p)中的x,其中x:Synset)
获取所考虑路径中所有Synset类型节点的列表。
head(…)
从该列表中获取第一个节点,并且
.pos='v'
检查该节点的“pos”属性是否为“v”.

非常感谢您的建议!这为我构建下面的答案提供了很多方法。直到阅读您的答案,我才意识到可以使用密码将路径添加到一起。我非常感谢您的帮助:)非常感谢您的建议!这为我构建下面的答案提供了很多方法。直到阅读您的答案,我才意识到可以使用Cypher将路径添加到一起。非常感谢您的帮助:)