我有一个包含多个节点的数据集,所有这些节点都标记为claim
,它们可以具有各种属性(名称P1
,P2
等,通过P2000
)。目前,claim
节点中的每一个节点可以仅具有这些属性中的一个,并且每个属性具有可以是不同类型的值(即,P1
可以是字符串,P2
可以是浮点型,P3
整数等)。我还需要能够通过任何属性查找节点(即"find all nodes with P3 which equals to 42"
)。Neo4j中可以接受混合类型索引吗?
我已经将它建模为具有属性value
并根据P属性标签的节点。然后我在标签claim
和属性value
上定义模式索引。查找然后看起来像这样:
MATCH (n:P569:claim) WHERE n.value = 42 RETURN n
我的第一个问题是 - 这是好的有这样的索引?是否允许混合类型索引?
第二个问题是,上述工程查找(虽然我不知道它是否使用索引或没有),但是这不 - 注意标签顺序切换:
neo4j-sh (?)$ MATCH (n:claim:P569) WHERE n.value>0 RETURN n;
IncomparableValuesException: Don't know how to compare that. Left: "113" (String); Right: 0 (Long)
P569
性质都是数字,但其他P值的字符串属性是其中一个是“113”。不知何故,即使我说的标签应当是既要求和P569,在“113”值仍包含在比较中,即使它没有P569标签:
neo4j-sh (?)$ MATCH (n:claim) WHERE n.value ="113" RETURN LABELS(n);
+-------------------+
| LABELS(n) |
+-------------------+
| ["claim","P1036"] |
| ["claim","P902"] |
+-------------------+
这里有什么问题 - 为什么它的工作原理有一个标签顺序但不是另一个?这个数据模型可以改进吗?
如果你想比较它们,你还可以在属性或toInt()上使用toString()。索引可以有混合类型。您还可以使用'USING INDEX n:claim(value)'添加索引提示。在一个索引中,我认为这些值主要是以类似的格式(或字符串)存储的 – 2015-02-13 01:30:27