Neo4j + PopotoJS:基于预定义约束的过滤器图形

时间:2015-08-26 11:41:07

标签: neo4j

我对基于PopotoJs中的预定义约束的查询有疑问。在此example中,可以根据搜索框中定义的约束来过滤图表。 this示例可视化文件夹中的示例文件,约束仅为“Person”节点定义。它在示例html文件中指定,如下所示:

"Person": {
        "returnAttributes": ["name", "born"],
        "constraintAttribute": "name",
        // Return a predefined constraint that can be edited in the page.
        "getPredefinedConstraints": function (node) {
            return personPredefinedConstraints;
        },
        ....

在我的图表中,我想将该查询函数应用于多个节点。例如,我有2个节点:Contact(具有“name”属性)和Delivery(具有“address”属性) 我通过为每个节点定义两个函数来成功。但是,我还必须将两个具有不同输入id的搜索框表单(如constraint1和constraint2)放在一起。我不得不在相关的搜索框中进行查询。 有没有办法在一个搜索框中为多个节点定义查询?例如,在同一搜索框中搜索联系人姓名和/或递送地址?

由于

2 个答案:

答案 0 :(得分:1)

首先,我想指定预定义的约束功能仍然是实验性的(但功能齐全),还没有任何文档。

它旨在用于配置以过滤节点中显示的数据,而在example中,搜索框的使用只是动态显示其工作原理。

此功能的一个常见用途是在每个节点类型的配置中添加所需的预定义约束列表。

让我们来example

使用以下配置示例,将过滤图表以仅显示具有" born"属性和仅提供列表中具有标题的Movie节点:

"Person": {
    "getPredefinedConstraints": function (node) {
        return ["has($identifier.born)"];
    },
    ...
}

"Movie": {
    "getPredefinedConstraints": function (node) {
        return ["$identifier.title IN [\"The Matrix\", \"The Matrix Reloaded\", \"The Matrix Revolutions\"]"];
    },
    ...
}

然后在查询生成期间使用相应的节点标识符替换$ identifier变量。在这种情况下,生成的查询将如下所示:

MATCH (person:`Person`) WHERE has(person.born) RETURN person

在您的情况下,如果我正确理解您的问题,您正尝试使用此功能来实现搜索框以过滤数据。我仍然在研究这项功能但很快就无法上市:(

这是一种解决方法,但也许它可以在您的用例中使用,您可以将搜索框值保留在变量中:

var value = d3.select("#constraint")[0][0].value;
inputValue = value;

然后在所需的所有节点类型的预定义约束中使用它。 在此example人员将根据名称属性和标题上的电影进行过滤:

"Person": {
    "getPredefinedConstraints": function (node) {
        if (inputValue) {
            return ["$identifier.name =~ '(?i).*" + inputValue + ".*'"];
        } else {
            return [];
        }
    },
    ...
}

"Movie": {
    "getPredefinedConstraints": function (node) {
        if (inputValue) {
            return ["$identifier.title =~ '(?i).*" + inputValue + ".*'"];
        } else {
            return [];
        }
    },
    ...
}

所有内容都在此example的HTML页面中,因此您可以直接在页面上查看完整的来源。

答案 1 :(得分:0)

@Popoto,感谢您的描述性回复。我尝试了你的建议,它的效果非常好。使用实际代码,当我进行查询时,它仅显示查询的节点并使另一个节点数量为零。我想创建一个只查询相关节点的查询,而其他节点的数量仍然相同。

我为我的问题尝试了一个临时解决方案。我做的是:

将所有节点数据导出到JSON文件,在导出的JSON中搜索我的查询约束,如果文件存在于JSON中,则在相关节点中运行查询;如果没有,什么都不做。

通过这种方式,我当然需要定义许多具有不同变量名称的函数(与节点数量一样多)。无论如何,它不是一种支持方式,现在它可以工作。