1

所以我正在做一个涉及日语的个人项目。在这个项目中,我还使用了 Neo4J 数据库。

我偶然发现了一个非常特殊的问题,我希望得到您的专业知识。

基本上,我从我的数据库中检索了一些日文字符(称为平假名)。它没有什么特别之处。我将平假名字符分成几个子类别,基于一个音节由一个字符(例如'に','ni')或两个字符(例如'にょ','nyo',这是由 ni (に) 和 yo (よ)) 组成。

所以我的类别中有以下结构(这里有点简化):

Hiragana ------- Single character hiragana (like に)
            |--- Double character hiragana (like にょ)

这些类别中的每一个都链接到包含平假名值(如に或にょ)的节点(此处称为项目)。为了检索这些字符,我进行了一个查询,听起来像“给我属于列表“平假名”子列表的所有字符。实际代码没有什么特别之处,如下所示:

match(list:item_list)-[:sub_list*0..]->(sublist)-[:list_item]->(kana:item)-[:romaji]->(romaji:item)
where list.name =~'(?i)Hiragana'
return kana.value as item, romaji.value as answer  ORDER BY kana asc

由此,我得到以下错误:

Don't know how to compare that. Left: Node[496]{value:"にゅ"} (NodeProxy);
Right: Node[498]{value:"にょ"} (NodeProxy)

从一开始,我就很困惑数据库引擎不知道如何比较这些,因为它们似乎具有相同的类型(NodeProxy)。另外,我不觉得我的查询试图将节点的值与其他节点进行比较。

无论如何,我开始修改查询,因为我之前使用过它并且它有效。搜索了一段时间后,我注意到,在我的 return 子句中,如果我将kana.value 作为 item更改为,让我们说kana.value 作为 kana,它突然又可以工作了。

我又更改了该值并得到以下结果:

  • kana.value 作为项目:KO
  • kana.value 作为假名:好的
  • kana.value 作为测试:KO
  • kana.value as es : KO
  • kana.value 作为问题:KO
  • kana.value as romaji : KO
  • kana.value 作为平假名:KO
  • 返回假名值:KO
  • kana.value 作为:KO
  • kana.value 为 kanak : KO

因此,无论出于何种原因,只有“kana.value as kana”才有效……

你们知道发生了什么吗?这可能是一个错误而不是我的错误吗?

洛伊克。

PS:我使用php中的graphaware库调用数据库,但问题无关,因为错误也发生在noe4j浏览器中

4

1 回答 1

0

我没有找到这个问题的根本原因,但我找到了解决方法。

我不满足于让这个问题得不到解决,但我不想再花时间在这上面,我也不希望你们在这上面浪费时间。

解决方法

所以我所做的是修改我的查询的一部分。我没有将节点命名为“ kana ”并返回“ kana.value ”,而是将名称更改为“ character ”,现在我返回“ character.value ”。

有效,别问我为什么。

旧查询:

match(list:item_list)-[:sub_list*0..]->(sublist)-[:list_item]->(kana:item)-[:romaji]->(romaji:item)
where list.name =~'(?i)Hiragana'
return kana.value as item, romaji.value as answer  ORDER BY kana asc

新查询:

match(list:item_list)-[:sub_list*0..]->(sublist)-[:list_item]->(character:item)-[:romaji]->(romaji:item)
where list.name =~ '(?i)Hiragana' return character.value as item, romaji.value as answer

问候,

洛伊克。

于 2016-07-13T03:14:32.917 回答