2015-02-10 53 views
2

我有一个包含多个节点的数据集,所有这些节点都标记为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"] | 
+-------------------+ 

这里有什么问题 - 为什么它的工作原理有一个标签顺序但不是另一个?这个数据模型可以改进吗?

+0

如果你想比较它们,你还可以在属性或toInt()上使用toString()。索引可以有混合类型。您还可以使用'USING INDEX n:claim(value)'添加索引提示。在一个索引中,我认为这些值主要是以类似的格式(或字符串)存储的 – 2015-02-13 01:30:27

回答

3

让我至少试着对您的问题进行旁观,还有另一种方法可以对此进行建模,以至少解决一些问题。

您正在将属性名称编码为标签。也许你想这样做,以加快查找该属性适用的节点子集;仍然看起来像是通过将无与伦比的数据值全部放在名为“value”的同一个属性中造成了很多困难。

如果除了使用这些标签,每个属性的名称与该值相同,该怎么办?即:

CREATE (n:P569:claim { P569: 42}); 

你仍然可以得到您的标签查找,而是通过分离的属性名称,你能保证查询规划绝不会不小心在它建立一个执行计划的方式比较无比值。然后,您的这个节点查询将是:

MATCH (n:P569:claim) WHERE n.P569 > 5 AND n.P569 < 40 RETURN n; 

请注意,如果你知道要使用正确的标签,那么你保证知道使用正确的属性名称。通过使用不同名称的属性,如果您以P569的数据总是整数的方式记录您的数据,那么您无法完成您无法比拟的情况。 (我认为这是因为密码执行该查询的具体方式而发生的)

这里可能存在的一个缺点是,如果您必须对所有这些属性进行索引,那么可能会有很多索引,但仍可能是考虑。

+0

据我所知,命名属性不同将需要维护2000个索引,而且我的实验显示试图创建2000个索引使得Neo4j停止并且OOM错误导致崩溃。 – StasM 2015-02-11 05:01:32

+0

你的数据量是多少?你需要2000年的索引吗?像现在一样将数据类型混合在一个属性中,看起来好像除非你仔细计划你的查询,比较不可比的值经常会出现。在某些方面,这是对单一属性的误用,因为您将2,000种不同类型的信息放入一个属性中。 – FrobberOfBits 2015-02-11 17:20:10

+0

全部数据量约为100M项目。是的,所有的属性都需要编入索引。 – StasM 2015-02-11 18:38:05

0

我认为有必要退后一步,想一想你真正想实现的目标,以及为什么你首先要有2000个属性,以及如何在图形中对它们进行不同的建模?

此外,请确保放弃不需要的属性,并使用coalesce()提供默认设置。

+0

我有2000个属性,因为数据项可以有2000个不同的属性。我愿意提供关于如何在图表中表现最好的想法。 – StasM 2015-02-13 06:56:10

相关问题