Neo4j:尝试在不同的数据块中查找遵循特定单词或模式的字符串,但无法找出正确的查询来实现这一目标

问题描述 投票:0回答:2

我正在尝试查找数据库中特定类型节点的数据中包含的特定属性的值。我认为要做到这一点,我需要匹配始终位于这些值之前的某个字符串,然后从数据块中提取这些值。

所以,我正在尝试做这样的事情:

MATCH 
    (c:course)-[:PARENT_OF*]->(n:item) 
WHERE 
    n.data CONTAINS "some string"       
RETURN 
    {the text immediately following "some string"}

抱歉说得有点含糊……由于各种原因,不确定我能否具体说明。

基本上,我想找到 - 假设数据块是“你好,我的名字是莎莉,我现在真的可以去吃薯条” - 数据块中的名字,所以,莎莉。此外,如果数据中还有另一个名字,遵循“我的名字是 ___”模式,我也想找到它。这有道理吗?

在 Neo4j 中可以做到吗?

我知道有一种方法可以返回节点中包含的全部内容/数据,而且我现在也知道有一种方法可以返回该节点中的部分内容,但这就是我陷入困境的地方,因为我可以仅从上面的稀疏示例中获取 - Neo4j 仅返回我提供的字符串的一些子字符串,而不返回其后的任何内容。

我已经尝试过了

...
RETURN 
    substring(n.data,100,500)

查找数据的一部分,从数据中的第 100 个字符开始,到第 500 个字符停止。

我也尝试过

...
RETURN 
    right('hello', 3)

在引号('hello')中查找子字符串的一部分,特别是从该子字符串中的第三个字符之后开始(这样我会得到像'llo'这样的结果)。

我想我不知道如何在 Neo4j 中查询模式,以便它可以给我遵循该模式的内容。

string neo4j substring
2个回答
0
投票

如果您希望文本以您的文本片段开头,您可以这样做:

UNWIND [
    "Hello my name is Sally and I really could go for some fries right now",
    "Hello my name is Ben and I really could go for a burger right now"
] AS text
WITH text, "Hello my name is" as q
WHERE text starts with q
RETURN trim(right(text, size(text)-size(q)))

如果您只希望文本包含文本片段,则需要使用 apoc.text.indexOf:

UNWIND [
    "Hello my name is Sally and I really could go for some fries right now",
    "Hello my name is Ben and I really could go for a burger right now"
] AS text
WITH text, "my name is" as q
WHERE text contains q
RETURN trim(right(text, size(text)-apoc.text.indexOf(text,q)-size(q)))

0
投票

稍微扩展一下 Håkan 的答案。如果你说同一字符串中可能有多个名称,例如“你好,我的名字是约翰,我姐姐的名字是简,我们都喜欢炸薯条”,并且您想提取键“名字是”后面的所有名字,那么这可能会成功

WITH "name is " AS key 
MATCH (n:item) WHERE n.data CONTAINS key 
WITH key, n.data AS text, apoc.text.indexesOf(n.data, key) AS indexes 
UNWIND indexes AS index 
WITH key, text, index+size(key) AS nameindex 
RETURN substring(text, nameindex, apoc.text.indexOf(text, " ", nameindex)-nameindex)

需要注意的是,如果文本末尾有名称,则此版本不起作用(因为名称后面需要一个空格)。还需要更多地思考如何解决这个案例。

© www.soinside.com 2019 - 2024. All rights reserved.