【发布时间】:2017-02-23 19:17:22
【问题描述】:
example graph(对不起,您需要点击图片)
我有一个包含两种节点的图:
- 身份节点作为结构元素(蓝色)不包含任何属性
- 版本化的值节点,包含属性/数据(橙色)
有两种关系类型:
- version-of:将 value-nodes 连接到 identity-nodes,并包含一个窗口,在该窗口内关系应有效(图片仅显示开始日期)
- parent-of:以分层方式连接身份节点
场景:
- 在任何给定时间,每个身份节点最多有一个有效值节点。
- 我想保留历史值并随时回顾,因此将当前有效的值复制到相应的身份节点将不起作用。
- 层次结构可以是任意深度,例如 1 到 10。
- 我不想使用值节点的属性使用从根到叶的完全限定路径字符串进行搜索。
- 我想找到沿 ID 节点的路径以及路径末尾的正确 value-of。 (想想文件系统目录路径。)
在此示例中,我正在搜索路径“A/CD/E”,其中 A CD E 是值节点的名称属性的值。基本上我想找到正确的“E”节点,这里是与 98 相关联的节点。下面的示例省略了时间以保持简短。
我该怎么做?这甚至可能只使用 Neo4J 吗? (很容易将查询包装在另一个脚本中,该脚本生成路径匹配,包括每个路径条目的命名 id 节点。)
我可以查询路径的开始和结束来限制搜索空间,但是中间的节点数量可变呢?在某种程度上,ID 节点必须在每次查询之前与它们的值合并,以匹配关系版本的时间窗口。
MATCH p=(start:value) -[:`version-of`]-> (:ID) <-[:`parent-of`*]- (:ID) <-[:`version-of`]- (end:value)
WHERE start.name = 'A' AND end.name = 'E'
RETURN p
我想问什么(使用可变深度键而不是简短示例);以下是无效的密码:
MATCH p=(start:value) -[:`version-of`]-> (:ID) <-[:`parent-of`*]- (:ID) <-[:`version-of`]- (end:value)
WHERE p = 'A/CD/E' // or something longer, "A/CD/E/F/X"
RETURN p, end
到目前为止我所看到的
我还可以沿路径构建名称列表,并将完整路径与查询字符串进行比较。但它无法获取 start 和 end 之间的节点的名称值:
MATCH p=(start:value) -[:`version-of`]-> (:ID) <-[:`parent-of`*]- (:ID) <-[:`version-of`]- (end:value)
WHERE start.name = 'A' AND end.name = 'E'
RETURN EXTRACT(n in nodes(p)|n['name'])
与查询相关的成对子图,但缺少路径。我可以在这里以某种方式获得 id,val 对的路径吗?
MATCH p=(start:value) -[:`version-of`]-> (:ID) <-[:`parent-of`*]- (:ID) <-[:`version-of`]- (end:value)
WHERE start.name = 'A' AND end.name = 'E'
UNWIND nodes(p) as id
MATCH (id) <-[:`version-of`]- (val)
RETURN COLLECT([id,val])
这是图表
MATCH (n) DETACH DELETE n
CREATE (:value {name:'A'}) -[:`version-of` {from:'2017-01-01'}]-> (:ID {id:32})
CREATE (:value {name:'CC'}) -[:`version-of` {from:'2017-01-05'}]-> (:ID {id:21})
CREATE (:value {name:'E'}) -[:`version-of` {from:'2017-02-01'}]-> (:ID {id:98})
CREATE (:value {name:'E'}) -[:`version-of` {from:'2017-02-01'}]-> (:ID {id:48})
MATCH (n:ID {id:21}) CREATE (:value {name:'CD'}) -[:`version-of` {from:'2017-03-01'}]-> (n)
MATCH (a:ID {id:32}),(b:ID {id:21}) CREATE (a)<-[:`parent-of`]-(b)
MATCH (a:ID {id:21}),(b:ID {id:98}) CREATE (a)<-[:`parent-of`]-(b)
MATCH (a:ID {id:32}),(b:ID {id:48}) CREATE (a)<-[:`parent-of`]-(b)
【问题讨论】:
-
什么都不清楚。显示这些测试数据的预期结果。
-
就在题为“我想问什么”的伪代码片段上。我希望我现在也设法在文本中更清楚地说明了这一点。
-
在您的图形创建密码中,值“E”和 :ID 48 之间有两个相同的行。我猜其中一个可以删除?
-
确实如此。删除,复制+粘贴错误